2

是否可以将带有 NOT IN 运算符的子查询转换为加入?我需要使用连接进行此查询

选择 *
从联系人
ContactIntID 不在的地方(
    选择 LinkToIntID
    从要求
    WHERE Requirements.uuJobStatus = 'Open')
4

3 回答 3

14

是的。

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

并简化:

SELECT c.*
FROM Contacts c
LEFT JOIN 
  Requirements r 
  ON  r.uuJobStatus = 'Open'
  AND c.ContactIntID = r.LinkToIntID
WHERE r.LinkToIntID IS NULL
于 2013-10-09T20:56:47.910 回答
3

使用 non 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
)

编辑:意识到你想要一个非子查询,但仍然值得注意我的回复:)

于 2013-10-09T23:45:17.823 回答
-1
SELECT *
FROM Contacts C LEFT JOIN Requirements R
ON C.CommonField = R.CommonField
WHERE R.CommonField IS NULL AND R.uuJobStatus = 'Open'
于 2013-10-09T20:57:27.790 回答