Подтвердить что ты не робот

Как написать "не в()" 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

4b9b3361

Ответ 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
    )