Как исключить строки, которые не объединяются с другой таблицей? - PullRequest
66 голосов
/ 30 декабря 2010

У меня есть две таблицы, одна имеет первичный ключ, другая - внешний ключ.

Я хочу получить данные из первичной таблицы, только если во вторичной таблице нет записи, содержащей ее ключ. Сортировка, противоположная простому внутреннему соединению, которое возвращает только строки, которые объединяются этим ключом.

Ответы [ 7 ]

223 голосов
/ 30 декабря 2010

alt text

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

Полное изображение соединения alt text

Из атласа: http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx

7 голосов
/ 30 декабря 2010
SELECT
   *
FROM
   primarytable P
WHERE
   NOT EXISTS (SELECT * FROM secondarytable S
     WHERE
         P.PKCol = S.FKCol)

Обычно , (NOT) EXISTS лучше, чем (NOT) IN или (LEFT) JOIN

4 голосов
/ 30 декабря 2010

использовать "не существует" левое соединение:

SELECT p.*
FROM primary_table p LEFT JOIN second s ON p.ID = s.ID
WHERE s.ID IS NULL
3 голосов
/ 30 декабря 2010
SELECT P.*
FROM primary_table P
LEFT JOIN secondary_table S on P.id = S.p_id
WHERE S.p_id IS NULL
2 голосов
/ 30 декабря 2010

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

Пример:

select ID, FName
from FirstTable
EXCEPT
select ID, SName
from SecondTable
1 голос
/ 01 ноября 2018

Другое решение:

SELECT * FROM TABLE1 WHERE id NOT IN (SELECT id FROM TABLE2)
0 голосов
/ 10 июля 2017

Это было полезно для использования в 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) для: таблицы B Ключ имеет значение NULL.

Бежал быстро и как заклинание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...