(SQL)用NOT EXISTS替换NOT IN,结果不同

时间:2013-11-06 22:31:28

标签: sql not-exists notin

尝试修复其他人的代码。 NOT IN杀死了性能。 我把它取出并替换为Not Exists,我得到了不同的结果。 注释掉的不是我的不存在。 有人看到我在这里做的任何蠢事吗?

IF @ProcessComplete = 1
    BEGIN

--      PRINT 'Group-Complete'
    INSERT INTO @ProcessIDTable
    SELECT DISTINCT(ProcessID)
    FROM vPortalInbox
    WHERE  GroupUserIDs LIKE '%,' + CAST(@UserID AS VARCHAR(MAX)) + ',%' 
    AND StepOwnerID IS NULL

    --AND ProcessID NOT IN (SELECT ProcessID FROM @ProcessIDTable)

    And  not exists (SELECT ProcessID FROM @ProcessIDTable)

2 个答案:

答案 0 :(得分:2)

你可以尝试:

And not exists (
  SELECT ProcessID
  FROM @ProcessIDTable
  WHERE ProcessID = vPortalInbox.ProcessID)

......或者甚至可能更好:您可以在vPortalInbox上尝试(左或右)外部联接到ProcessID,并在WHERE子句中指定{{1} }}:

@ProcessIDTable.ProcessID IS NULL

答案 1 :(得分:0)

1 --AND ProcessID NOT IN (SELECT ProcessID FROM @ProcessIDTable)

2 And  not exists (SELECT ProcessID FROM @ProcessIDTable)

以上两种说法不一样。仅当从not exists子句后的括号内的子查询中没有得到任何行时,not exists才会计算为true。 由于您不具有子查询的条件,因此不存在子句,除非该表为空,否则它将永远不会返回0行。

尝试使用where where子句:

FROM vPortalInbox P1
WHERE  GroupUserIDs LIKE '%,' + CAST(@UserID AS VARCHAR(MAX)) + ',%' 
AND StepOwnerID IS NULL

And  not exists (SELECT 1 FROM @ProcessIDTable P2
                 where  P1.ProcessID = P2.ProcessID  )