Как написать "не в ()" SQL-запрос, используя соединение - PullRequest
41 голосов
/ 15 апреля 2011

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

SELECT d1.Short_Code
FROM domain1 d1
WHERE d1.Short_Code NOT IN (
  SELECT d2.Short_Code
  FROM Domain2 d2
)

Я использую SQL Server 2008

Ответы [ 3 ]

60 голосов
/ 15 апреля 2011

Эта статья:

может быть, если вас интересует.

В двух словах этот запрос:

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, если таковые имеются.

14 голосов
/ 15 апреля 2011
SELECT d1.Short_Code 
FROM domain1 d1
LEFT JOIN domain2 d2
ON d1.Short_Code = d2.Short_Code
WHERE d2.Short_Code IS NULL
4 голосов
/ 15 апреля 2011

Я бы выбрал NOT EXISTS в этом случае.

SELECT D1.ShortCode
FROM Domain1 D1
WHERE NOT EXISTS
    (SELECT 'X'
     FROM Domain2 D2
     WHERE D2.ShortCode = D1.ShortCode
    )
...