Как выбрать все записи из одной таблицы, которые отсутствуют в другой таблице?
Описание проблемы
У меня есть две таблицы в базе данных:
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, этот запрос отлично подойдет. Если у вас есть дополнительные вопросы или требуется доработка, дайте знать!
"Вставка результатов хранимой процедуры в временную таблицу"
Как экранировать одинарную кавычку в SQL Server?
Как выполнить оператор UPDATE с JOIN в SQL Server?
Возможно ли задать условия в Count()?
Создание хранимой процедуры, если она еще не существует