我正在尝试根据另一个保存其先前状态(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 )
答案 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。