Ответ 1
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
Полное изображение присоединения
Из атома: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
У меня есть две таблицы, у одного есть первичный ключ, другой - как внешний ключ.
Я хочу извлечь данные из первичной таблицы, только если в дополнительной таблице нет есть запись, содержащая его ключ. Вид противоположности простого внутреннего соединения, который возвращает только строки, которые объединяются этим ключом.
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
Полное изображение присоединения
Из атома: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx
SELECT
*
FROM
primarytable P
WHERE
NOT EXISTS (SELECT * FROM secondarytable S
WHERE
P.PKCol = S.FKCol)
Как правило, (NOT) EXISTS
- лучший выбор, тогда (NOT) IN
или (LEFT) JOIN
используйте "не существует" левое соединение:
SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL
Если вы хотите выбрать столбцы из первой таблицы ", которые также присутствуют во второй таблице, тогда в этом случае вы также можете использовать EXCEPT
. В этом случае имена столбцов могут быть разными, но тип данных должен быть то же самое.
Пример:
select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable
Другое решение:
SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
Это было полезно использовать в COGNOS, потому что создание SQL-запроса "Не в" в Cognos было разрешено, но потребовалось слишком много времени для запуска. У меня была закодированная вручную таблица A для присоединения к таблице B в Cognos, поскольку A.key "не в" B.key, но запрос длился слишком долго или не возвращал результаты через 5 минут.
Для всех, кто ищет решение "НЕ В IN" в Cognos, вот что я сделал. Создайте запрос, который соединяет таблицы A и B с LEFT JOIN в Cognos, выбирая тип ссылки: таблица A.Key имеет значения от 0 до N в таблице B, а затем добавляет фильтр (они соответствуют Where Clauses) для: таблицы B.Key - NULL.
Быстро и быстро, как шарм.
У меня есть еще один звонок. Что если я хочу исключить строки, которые не объединяются с двумя другими таблицами