Как написать "не в()" sql-запрос с использованием join
Может кто-нибудь объяснить, как написать следующий SQL-запрос с помощью соединений. Я не хочу использовать не в, а также, если это возможно, я хотел бы заменить условие где.
SELECT d1.Short_Code
FROM domain1 d1
WHERE d1.Short_Code NOT IN (
SELECT d2.Short_Code
FROM Domain2 d2
)
Я использую SQL Server 2008
Ответы
Ответ 1
Эта статья:
может быть интересным для вас.
В нескольких словах этот запрос:
SELECT d1.short_code
FROM domain1 d1
LEFT JOIN
domain2 d2
ON d2.short_code = d1.short_code
WHERE d2.short_code IS NULL
будет работать, но он менее эффективен, чем конструкция NOT NULL
(или NOT EXISTS
).
Вы также можете использовать это:
SELECT short_code
FROM domain1
EXCEPT
SELECT short_code
FROM domain2
Это не используется ни NOT IN
, ни WHERE
(и даже нет объединений!), но это удалит все дубликаты на domain1.short_code
, если таковые имеются.
Ответ 2
SELECT d1.Short_Code
FROM domain1 d1
LEFT JOIN domain2 d2
ON d1.Short_Code = d2.Short_Code
WHERE d2.Short_Code IS NULL
Ответ 3
Я бы выбрал NOT EXISTS
в этом случае.
SELECT D1.ShortCode
FROM Domain1 D1
WHERE NOT EXISTS
(SELECT 'X'
FROM Domain2 D2
WHERE D2.ShortCode = D1.ShortCode
)