2015-05-16 665 views
1

我有一個查詢,我想添加一些日誌,以放棄成功匹配的結果時,我再向JOIN添加一個表。用SQL WHERE或JOIN「排除」結果?

我現在有一個額外凡在聲明中完成這個:

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

謝謝!

回答

0

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) 
+0

感謝其他的東西!按照這裏建議的方式,我使用了LEFT JOIN,但是對於其他所有回答者也表示非常的讚賞和感謝! – user3550402

2

在標準SQL的常用方法使用相關NOT EXISTS(另外NOT IN可能有一些非直觀的副作用時的NULL參與):

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

給予好評的是創造性的嘗試比別人^^ –

0

究竟JOIN是RDBMS快於子查詢。這Join vs. sub-query更多解釋這一點。使用下面的查詢:

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

不,JOIN通常不會更快,對於某些數據集,某些DBMS可能會出現這種情況。不存在更高效的概率很高。無論如何,你的鏈接的「正確」答案對體面優化器來說是不正確的,因爲他們可以重寫子查詢。 – dnoeth

+0

@dnoeth這些答案什麼解釋然後?http://stackoverflow.com/a/2577224/2236219 http://stackoverflow.com/a/2577188/2236219解釋呢? – Manwal

+1

這是一個*意見*,對於特定的DBMS可能是真實的,但它沒有任何證據支持,不能一概而論。只需閱讀評論。而第二個鏈接也不會聲稱它總是更快。兩種答案都是五年前的,並且優化器算法中有不斷的演變。 – dnoeth

0

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

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