Как выбрать все записи из одной таблицы, которые отсутствуют в другой таблице?
Описание проблемы
У меня есть две таблицы в базе данных:
table1
(id, name)table2
(id, name)
Мне нужно составить запрос, который выберет все имена из table2
, которых нет в table1
. Как правильно сформулировать этот SQL-запрос?
5 ответ(ов)
Это чистая теория множеств, и вы можете достичь этого с помощью операции minus
. Вот пример запроса:
SELECT id, name FROM table1
MINUS
SELECT id, name FROM table2
Данный запрос вернет строки из table1
, которые отсутствуют в table2
.
Вот что сработало лучше всего для меня.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Это было более чем в два раза быстрее, чем любой другой метод, который я пробовал.
Вы можете использовать оператор EXCEPT
в MS SQL Server или MINUS
в Oracle, поскольку они являются идентичными по своей функциональности. Более подробно об этом вы можете узнать в статье по следующему адресу: SQL Server EXCEPT clause is similar to MINUS clause in Oracle.
Обратите внимание на подводные камни. Если поле Name
в Table1
содержит значения Null, вы можете столкнуться с неожиданностями. Лучше использовать следующий запрос:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name, '')
FROM table1)
В этом запросе мы используем функцию ISNULL
для замены значений Null на пустую строку, что позволяет избежать проблем при сравнении.
Ваш запрос работает правильно. Он выбирает все записи из таблицы table1
, для которых нет соответствующих записей в таблице table2
. Используя LEFT JOIN, вы соединяете две таблицы по ID, а затем фильтруете результаты, оставляя только те, где t2_ID
из table2
равен NULL
, что означает отсутствие совпадений.
Вот ваш SQL-запрос:
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Если вам нужно получить только уникальные записи из table1
, которые не имеют связей в table2
, этот запрос отлично подойдет. Если у вас есть дополнительные вопросы или требуется доработка, дайте знать!
"Вставка результатов хранимой процедуры в временную таблицу"
Как выполнить оператор UPDATE с JOIN в SQL Server?
Следует ли мне использовать != или <> для обозначения "не равно" в T-SQL?
Выбор COUNT(*) с DISTINCT
Запрос UPDATE в SQL с использованием JOINов