我试图从临时表中选择基于另一个临时表的记录,该临时表保存其先前的状态(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)
是的,您可以使用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表现得更好.
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |