[英]SQL Server NOT EXISTS efficiency
我有兩張表Card
和History
與一對多的關系:一張卡可以有一個或多個歷史。 Card
有一個CardId
列, History
有一個CardId
和一個StatusId
列。
我想要一個SQL腳本,它選擇唯一沒有StatusId = 310的歷史記錄的卡片。
這就是我嘗試過的。
SELECT
C.CardId
FROM
Card C
WHERE NOT EXISTS (SELECT *
FROM History H
WHERE H.CardId = C.CardId AND H.StatusId = 310)
但我想知道是否有一種有效的方法。
提前致謝。
要回答關於是否有更有效的方式的問題:
簡答:不, not exists
很可能是最有效的方法。
答案很長:Aaron Bertrand的文章中有許多不同方法做同樣事情的基准我應該不使用,外部應用,左外部連接,除了或不存在? 劇透: not exists
勝利。
我會堅持你的原始代碼使用不存在,但亞倫的文章有很多例子,你可以適應你的情況,以確認沒有其他更有效。
select c.CardId
from Card c
where not exists(
select 1
from History h
where h.CardId=c.CardId
and h.StatusId=310
)
你所追求的是一種“負面的聯合”。 這是沒有子查詢的版本:
SELECT c.CardId
FROM Card c
LEFT OUTER JOIN History h
ON h.CardId = c.CardId
AND h.StatusId = 310
WHERE h.CardId IS NULL;
您的NOT EXISTS
方法看起來很合理,但還有另一種方法。
SELECT *
FROM Card C
WHERE EXISTS (SELECT 1
FROM history H
WHERE H.CardId = C.CardId
HAVING Count(CASE WHEN H.StatusId = 310 THEN 1 END) = 0)
通過使用實時數據運行這兩個查詢來檢查性能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.