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

时间:2015-03-26 14:16:29

标签: 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 )

1 个答案:

答案 0 :(得分: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

然而,更好的解决方案是使用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
);

正如Aaron所指出的,this usually performs better than a LEFT JOIN