簡體   English   中英

使用SQL WHERE或JOIN“排除”結果?

[英]“Exclude” results with an SQL WHERE or JOIN?

我有一個查詢,我想向其中添加一些日志,以刪除在向JOIN中添加一個表時成功匹配的結果。

我現在通過附加的WHERE IN語句來完成此操作:

SELECT blah blah FROM donation
WHERE donation.id NOT IN (SELECT donation_id FROM donation_relation)

我只是擔心,當表開始增長時,從子查詢中的donation_relation表中選擇所有ID字段將開始拖動。 使用JOIN進行此排除的更有效方法(如果存在)是什么? 這兩個表可以在donation.iddonation_relation.donation_id上聯接

謝謝!

標准SQL中的常用方法使用相關的NOT EXISTS(另外,當涉及NULL時,NOT IN可能會產生一些非直觀的副作用):

SELECT blah blah FROM donation as d
WHERE  NOT EXISTS
   (SELECT * FROM donation_relation as dr 
    where dr.donation_id = d.donation_id)

LEFT OUTER JOIN替代:

SELECT blah blah
FROM donation
  LEFT JOIN donation_relation ON donation.id = donation_relation.donation_id 
WHERE donation_relation.donation_id IS NULL;

可能更快,尤其是在使用MySQL時。

EXISTS版本:

SELECT blah blah FROM donation
WHERE NOT EXISTS (SELECT donation_id FROM donation_relation
                  WHERE donation.id = donation_relation.donation_id )

確實,JOIN比RDBMS中的子查詢要快。 Join vs.子查詢對此有更多解釋。 使用以下查詢:

SELECT blah blah 
FROM   donation 
       LEFT JOIN donation_relation 
              ON donation.id = donation_relation.donation_id 
WHERE  donation_relation.donation_id IS NULL 

您可以使用NOT EXISTS (反NOT EXISTS ):

SELECT blah blah FROM donation
WHERE NOT EXISTS (
    SELECT 1 FROM donation_relation
    WHERE donation_relation.donation_id = donation.id
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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