(SQL)将不在替换为不存在,结果不同

(SQL)将不在替换为不存在,结果不同,sql,not-exists,notin,Sql,Not Exists,Notin,试图修复其他人的代码。这不符合性能。 我把它拿出来,换成了不存在,我得到了不同的结果。 注释掉的not in就在我的not exists上方。 有人看到我在这里干什么蠢事吗 IF @ProcessComplete = 1 BEGIN -- PRINT 'Group-Complete' INSERT INTO @ProcessIDTable SELECT DISTINCT(ProcessID) FROM vPortalInbox WHERE G

试图修复其他人的代码。这不符合性能。 我把它拿出来,换成了不存在,我得到了不同的结果。 注释掉的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)
你可以试试:

And not exists (
  SELECT ProcessID
  FROM @ProcessIDTable
  WHERE ProcessID = vPortalInbox.ProcessID)
…或者可能更好:您可以尝试在ProcessID上左或右外部连接到vPortalInbox,并在WHERE子句中指定@ProcessIDTable.ProcessID为NULL:

1-和ProcessID不在从@ProcessIDTable中选择ProcessID中

上述两种说法不尽相同。not exist只有在not exists子句后面括号内的子查询中没有行时才会计算为true。 由于您没有以下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  )

它们做两件不同的事情。特别是,您的“不存在”不涉及所选的行。您应该真正提出标题反映您试图寻求帮助的问题。我在做一些愚蠢的事情并不是你想问的问题。在这种特殊情况下,你甚至可以使用除了:select ProcessID from。。。除了从@ProcessIDTable.Yep中选择ProcessID之外,我是个白痴。完全忘记添加where子句。非常感谢。我想我已经看了三十分钟了。
2 And  not exists (SELECT ProcessID FROM @ProcessIDTable)
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  )