如何使用join编写"not in()"sql查询

Ela*_*esh 45 sql t-sql sql-server notin

有人可以提供如何使用连接编写以下sql查询.我不想使用作为以及如果可能的话,我想,以取代那里的条件也是如此.

SELECT d1.Short_Code
FROM domain1 d1
WHERE d1.Short_Code NOT IN (
  SELECT d2.Short_Code
  FROM Domain2 d2
)
Run Code Online (Sandbox Code Playgroud)

我正在使用SQL Server 2008

Qua*_*noi 63

本文:

如果您感兴趣,可能会感兴趣.

有几个词,这个查询:

SELECT  d1.short_code
FROM    domain1 d1
LEFT JOIN
        domain2 d2
ON      d2.short_code = d1.short_code
WHERE   d2.short_code IS NULL
Run Code Online (Sandbox Code Playgroud)

会起作用,但效率低于NOT NULL(或NOT EXISTS)构造.

你也可以用这个:

SELECT  short_code
FROM    domain1
EXCEPT
SELECT  short_code
FROM    domain2
Run Code Online (Sandbox Code Playgroud)

这既不使用NOT IN也不使用WHERE(甚至没有连接!),但这将删除所有重复项(domain1.short_code如果有的话).

  • @Aducci:我什么都不假设,我只是重写原始查询。 (2认同)
  • @Aducci:`LEFT JOIN`确实效率较低.问题是"如何在没有'NOT IN'的情况下重写 - 这就是如何. (2认同)

Adu*_*cci 14

SELECT d1.Short_Code 
FROM domain1 d1
LEFT JOIN domain2 d2
ON d1.Short_Code = d2.Short_Code
WHERE d2.Short_Code IS NULL
Run Code Online (Sandbox Code Playgroud)


Rob*_*ler 5

I would opt for NOT EXISTS in this case.

SELECT D1.ShortCode
FROM Domain1 D1
WHERE NOT EXISTS
    (SELECT 'X'
     FROM Domain2 D2
     WHERE D2.ShortCode = D1.ShortCode
    )
Run Code Online (Sandbox Code Playgroud)

  • 优化器将为“NOT IN”和“NOT EXISTS”构建完全相同的计划(只要“short_code”不可为空)。不会有“复杂的 OR 操作”。 (3认同)