0

试图修复别人的代码。NOT IN 会破坏性能。我把它拿出来替换为不存在,我得到了不同的结果。注释掉的 not in 就在我的不存在之上。有人看到我在这里做的蠢事吗?

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)
4

2 回答 2

2

你可以试试:

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

...或者甚至可能更好:您可以尝试对vPortalInboxon进行(左或右)外部连接ProcessID,并在您的WHERE子句中指定@ProcessIDTable.ProcessID IS NULL

...
SELECT DISTINCT(ProcessID)
FROM vPortalInbox LEFT OUTER JOIN @ProcessIDTable 
     ON vPortalInbox.ProcessID = @ProcessIDTable.ProcessID 
WHERE  GroupUserIDs LIKE '%,' + CAST(@UserID AS VARCHAR(MAX)) + ',%' 
AND StepOwnerID IS NULL AND @ProcessIDTable.ProcessID IS NULL
于 2013-11-06T22:45:49.997 回答
0

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

2 And  not exists (SELECT ProcessID FROM @ProcessIDTable)

上述两种说法并不相同。仅当您从不存在子句后面的括号内的子查询中没有任何行时,不存在才会评估为真。由于 not exists 子句后面的子查询没有条件,因此除非表为空,否则它永远不会返回 0 行。

尝试使用这个 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  )
于 2013-11-06T22:58:25.017 回答