簡體   English   中英

SQL Server NOT EXISTS效率

[英]SQL Server NOT EXISTS efficiency

我有兩張表CardHistory與一對多的關系:一張卡可以有一個或多個歷史。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM