7

Как выбрать все записи из одной таблицы, которые отсутствуют в другой таблице?

1

Описание проблемы

У меня есть две таблицы в базе данных:

  • table1 (id, name)
  • table2 (id, name)

Мне нужно составить запрос, который выберет все имена из table2, которых нет в table1. Как правильно сформулировать этот SQL-запрос?

5 ответ(ов)

0

Это чистая теория множеств, и вы можете достичь этого с помощью операции minus. Вот пример запроса:

SELECT id, name FROM table1
MINUS
SELECT id, name FROM table2

Данный запрос вернет строки из table1, которые отсутствуют в table2.

0

Вот что сработало лучше всего для меня.

SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID

Это было более чем в два раза быстрее, чем любой другой метод, который я пробовал.

0

Вы можете использовать оператор EXCEPT в MS SQL Server или MINUS в Oracle, поскольку они являются идентичными по своей функциональности. Более подробно об этом вы можете узнать в статье по следующему адресу: SQL Server EXCEPT clause is similar to MINUS clause in Oracle.

0

Обратите внимание на подводные камни. Если поле Name в Table1 содержит значения Null, вы можете столкнуться с неожиданностями. Лучше использовать следующий запрос:

SELECT name
FROM table2
WHERE name NOT IN
    (SELECT ISNULL(name, '')
     FROM table1)

В этом запросе мы используем функцию ISNULL для замены значений Null на пустую строку, что позволяет избежать проблем при сравнении.

0

Ваш запрос работает правильно. Он выбирает все записи из таблицы 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, этот запрос отлично подойдет. Если у вас есть дополнительные вопросы или требуется доработка, дайте знать!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь