如何选择另一个表中不存在或具有不同状态的记录?

Apo*_*fix 0 sql sql-server

我试图从临时表中选择基于另一个临时表的记录,该临时表保存其先前的状态(StatusHistory).

因此,如果状态表中不存在记录,则应选择该记录.如果记录的状态与StatusHistory表中的状态不同,则应选择记录.否则,如果StatusHistory表中存在相同的状态,则应忽略它.

我有这个SQL但它似乎不是最好的解决方案.假设表中有数千条记录,你能指点我一个更好的方法吗?是否可以使用JOIN语句获得相同的结果?

SELECT  AI.item
FROM #AllItems AI
WHERE NOT EXISTS ( 
        SELECT * FROM #StatusHistory HS
           WHERE HS.itemId = AI.itemId
                 ) OR NOT AI.itemStatus IN ( SELECT HS.itemStatusHistory
                                             FROM #StatusHistory HS
                                             WHERE HS.itemId = AI.itemId 
                                             AND HS.itemId = AI.itemId )
Run Code Online (Sandbox Code Playgroud)

Ric*_*ard 5

是的,您可以使用LEFT JOIN执行此操作.

SELECT AI.item
FROM #AllItems AI
    LEFT JOIN #StatusHistory HS ON AI.itemId = HS.itemId
        AND AI.itemStatus = HS.itemStatusHistory
WHERE HS.itemId IS NULL
Run Code Online (Sandbox Code Playgroud)

但是,更好的解决方案是使用NOT EXISTS:

SELECT AI.item
FROM #AllItems AI
WHERE NOT EXISTS
(
   SELECT 1 FROM #StatusHistory SH
   WHERE SH.itemId = AI.itemId
       AND SH.itemStatusHistory = AI.itemStatus
);
Run Code Online (Sandbox Code Playgroud)

正如Aaron所指出的,这通常比LEFT JOIN表现得更好.