Sql server 使用“not in”运算符将子查询转换为join

Sql server 使用“not in”运算符将子查询转换为join,sql-server,join,subquery,Sql Server,Join,Subquery,是否可以使用NOT IN运算符将子查询转换为join?我需要使用联接进行此查询 SELECT * FROM Contacts WHERE ContactIntID NOT IN( SELECT LinkToIntID FROM Requirements WHERE Requirements.uuJobStatus = 'Open') 对 并简化了: SELECT c.* FROM Contacts c LEFT JOIN Requirements r ON

是否可以使用NOT IN运算符将子查询转换为join?我需要使用联接进行此查询

SELECT * FROM Contacts WHERE ContactIntID NOT IN( SELECT LinkToIntID FROM Requirements WHERE Requirements.uuJobStatus = 'Open') 对

并简化了:

SELECT c.*
FROM Contacts c
LEFT JOIN 
  Requirements r 
  ON  r.uuJobStatus = 'Open'
  AND c.ContactIntID = r.LinkToIntID
WHERE r.LinkToIntID IS NULL

使用非exists通常比使用LEFT JOIN性能更好。根据上述答案, 联系人将加入所有记录,不管它们是否匹配,然后稍后使用IS NULL子句将它们过滤掉

SELECT *
FROM Contacts c
WHERE NOT EXISTS
(
    SELECT 1
    FROM Requirements r
    WHERE Requirements.uuJobStatus = 'Open'
    AND ContractIntID = r.LinkToIntID
)

编辑:意识到您需要非子查询,但值得注意的是,我的回答是:

最好的做法是尽可能不使用not IN运算符,因为not IN运算符会根据not IN运算符中给出的条件检查表中的所有行,该条件会使索引的存在变得不相关,并且查询性能可能会非常令人痛苦:此查询是错误的-不等同于中的查询这个问题。它将返回完全为零的行-表中可能包含的任何数据。如果您希望提高效率且不存在空问题,请使用NOT EXISTS:据我所知,连接的性能优于子查询。因此,我们希望避免子查询并使用联接。虽然相关子查询也是一种性能较差的子查询,因此只要求连接。我知道,这是一种常见的误解。这看起来确实很奇怪,但有了适当的索引,“不存在”几乎总是赢家。但是,如果您仔细阅读本文,文章最后会说:但是,一如既往,您需要在自己的环境中测试这些模式,使用您的模式、数据和硬件,并与您自己的工作负载混合。genuis解决方案x年后
SELECT *
FROM Contacts C LEFT JOIN Requirements R
ON C.CommonField = R.CommonField
WHERE R.CommonField IS NULL AND R.uuJobStatus = 'Open'
SELECT *
FROM Contacts c
WHERE NOT EXISTS
(
    SELECT 1
    FROM Requirements r
    WHERE Requirements.uuJobStatus = 'Open'
    AND ContractIntID = r.LinkToIntID
)