У меня есть две таблицы, одна из которых имеет первичный ключ, а другая - внешний.
Я хочу получить данные из первичной таблицы, только если во вторичной таблице нет записи, содержащей ее ключ. Это своего рода противоположность простому внутреннему соединению, которое возвращает только строки, соединенные вместе по этому ключу.
B.Key IS NULL
мы все еще сопоставимыA.Key = B.Key
?SELECT * FROM primarytable P WHERE NOT EXISTS (SELECT * FROM secondarytable S WHERE P.PKCol = S.FKCol)
Как правило ,
(NOT) EXISTS
это лучший выбор(NOT) IN
или(LEFT) JOIN
источник
LEFT JOIN
превосходитNOT EXIST
используйте левое соединение "не существует":
SELECT p.* FROM primary_table p LEFT JOIN second s ON p.ID = s.ID WHERE s.ID IS NULL
источник
Другое решение:
SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
источник
SELECT P.* FROM primary_table P LEFT JOIN secondary_table S on P.id = S.p_id WHERE S.p_id IS NULL
источник
P.key = S.key
а затем говоримwhere S.key IS NULL
, то разве это не делает P.key также нулевым?Если вы хотите выбрать столбцы из «Первой таблицы», которые также присутствуют во Второй таблице, то в этом случае вы также можете использовать
EXCEPT
. В этом случае имена столбцов также могут быть разными, но тип данных должен быть таким же.Пример:
select ID, FName from FirstTable EXCEPT select ID, SName from SecondTable
источник
Это было полезно использовать в COGNOS, потому что создание оператора SQL «Not in» в Cognos было разрешено, но его выполнение заняло слишком много времени. Я вручную закодировал таблицу A для присоединения к таблице B в Cognos как A.key «не в» B.key, но запрос занимал слишком много времени / не возвращал результаты через 5 минут.
Для всех, кто ищет решение «НЕ ВХОДИТ» в Cognos, вот что я сделал. Создайте запрос, который объединяет таблицы A и B с LEFT JOIN в Cognos, выбрав тип ссылки: таблица A. Key имеет значения от «0 до N» в таблице B, затем добавлен фильтр (они соответствуют предложениям Where) для: table B .Key имеет значение NULL.
Бежал быстро и как шарм.
источник