Поиск несвязанных записей с помощью SQL
Я пытаюсь написать запрос, чтобы найти записи, которые не имеют соответствующей записи в другой таблице.
Например, у меня есть две таблицы, структуры которых выглядят примерно так:
Table1
State | Product | Distributor | other fields
CA | P1 | A | xxxx
OR | P1 | A | xxxx
OR | P1 | B | xxxx
OR | P1 | X | xxxx
WA | P1 | X | xxxx
VA | P2 | A | xxxx
Table2
State | Product | Version | other fields
CA | P1 | 1.0 | xxxx
OR | P1 | 1.5 | xxxx
WA | P1 | 1.0 | xxxx
VA | P2 | 1.2 | xxxx
(Состояние/Продукт/Дистрибьютор вместе образуют ключ для Таблицы 1. Состояние/Продукт является ключом для Таблицы2)
Я хочу найти все комбинации State/Product/Version, которые не используются дистрибутором X. (Таким образом, результатом в этом примере является CA-P1-1.0 и VA-P2-1.2.)
Любые предложения по запросу для этого?
Ответы
Ответ 1
SELECT
*
FROM
Table2 T2
WHERE
NOT EXISTS (SELECT *
FROM
Table1 T1
WHERE
T1.State = T2.State AND
T1.Product = T2.Product AND
T1.Distributor = 'X')
Это должно быть совместимо с ANSI.
Ответ 2
В T-SQL:
SELECT DISTINCT Table2.State, Table2.Product, Table2.Version
FROM Table2
LEFT JOIN Table1 ON Table1.State = Table2.State AND Table1.Product = Table2.Product AND Table1.Distributor = 'X'
WHERE Table1.Distributor IS NULL
Не требуется никаких подзапросов.
Изменить: как показывают комментарии, DISTINCT не требуется. Спасибо!
Ответ 3
выберите * из таблицы1, где не указано состояние (выберите состояние из таблицы 1, где distributor = 'X')
Наверное, не самый умный, но он должен работать.
Ответ 4
SELECT DISTINCT t2.State, t2.Product, t2.Version
FROM table2 t2
JOIN table1 t1 ON t1.State = t2.State AND t1.Product = t2.Product
AND t1.Distributor <> 'X'
Ответ 5
В Oracle:
SELECT t2.State, t2.Product, t2.Version
FROM Table2 t2, Table t1
WHERE t1.State(+) = t2.State
AND t1.Product(+) = t2.Product
AND t1.Distributor(+) = :distributor
AND t1.State IS NULL