Как найти значение, которого нет в одной таблице, через другую таблицу в SQL

Таблица издателяКак найти значение, которого нет в одной таблице, через другую таблицу в SQL

Книжный столКак найти значение, которого нет в одной таблице, через другую таблицу в SQL

Это 2 таблицы в моем SQL-запросе, и я хочу узнать издателя, который не опубликовал ни одной книги.

Я использую SQL Server, и я использовал:

SELECT PublisherID 
FROM Publisher 
WHERE PublisherID NOT IN (SELECT PublisherID FROM Book); 

но это не работает. Я делаю что-то неправильно?

Это результат для этого запроса Таблица результатов

Как найти значение, которого нет в одной таблице, через другую таблицу в SQL

Я просто получаю пустую таблицу только с именами столбцов

HannahJ 16.05.2022 06:57

Он должен показывать PublisherID = P04.

HannahJ 16.05.2022 06:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны использовать условие PublisherID IS NOT NULL внутри подзапроса. Ваша NULL запись возвращала false для всех строк.

SELECT PublisherID 
FROM Publisher 
WHERE PublisherID NOT IN (SELECT PublisherID FROM Book WHERE PublisherID IS NOT NULL); 

В качестве альтернативы вы можете использовать LEFT JOIN и добавить условие с помощью WHERE b.PublisherID IS NULL.

SELECT *
FROM Publisher p
    LEFT JOIN Book b
        ON b.PublisherID = p.PublisherID
WHERE b.PublisherID IS NULL

Чтобы узнать издателя, который опубликовал более 1 книги, вы можете использовать GROUP BY и HAVING с IN, как показано ниже.

SELECT PublisherID 
FROM @Publisher 
WHERE PublisherID IN (
    SELECT PublisherID
    FROM @Book 
    WHERE PublisherID IS NOT NULL
    GROUP BY PublisherID
    HAVING COUNT(PublisherID) > 1
);

Как узнать издательство, выпустившее более 1 книги

HannahJ 16.05.2022 07:22

Вы можете использовать GROUP BY и HAVING, чтобы найти такой результат

Karan 16.05.2022 08:19

NOT IN может возвращать неверные результаты, когда задействованы значения NULL. Вместо этого используйте NOT EXISTS

SELECT p.PublisherID 
FROM Publisher p
WHERE NOT EXISTS (SELECT 1
    FROM Book b
    WHERE b.PublisherID = p.PublisherID
); 

Другие вопросы по теме