我一直在做的是查找A中沒有B中相關行的行,FK在B上?
SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL
基本上,我試圖找到沒有關聯b
,如果外國密鑰存儲在b
的a
行。這是做到這一點的正確方式,還是有不同類型的加入來做到這一點?
我一直在做的是查找A中沒有B中相關行的行,FK在B上?
SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL
基本上,我試圖找到沒有關聯b
,如果外國密鑰存儲在b
的a
行。這是做到這一點的正確方式,還是有不同類型的加入來做到這一點?
是的,這是正常的方式,我不知道更好的方法。
您正在尋找NOT EXISTS
:
SELECT
*
FROM
a
WHERE
NOT EXISTS (SELECT 1 FROM b WHERE a_id = a.id)
有上b.a_id
索引幫助這個查詢的性能。
你可以嘗試
Select * from a where a.id not in (Select a_id from b)
同意 – 2011-05-31 16:13:20
@Andrea Girardi:首先,它應該是('select a_id from b'),除此之外,如果從子查詢返回的值中有'NULL',這將失敗。 – Tomalak 2011-05-31 16:18:13
@Tomalak耶! ;) – 2011-05-31 16:19:21
前面三種迴應是正確的,在這一點上我想你可以considere三個類型的查詢性能。你可以看看這個網址:
http://rockycode.com/blog/not-vs-outer-join-performance/
在我看來我覺得外部聯接是最好的方式,如果你沒有太多的行,三路都或多或少平等。
如果桌子很大,這將會很慢...... – 2011-05-31 16:14:24
@Denis:當然不是。當有'b.a_id'索引時,這個速度會非常快。 – Tomalak 2011-05-31 16:15:38
+1 - 另請參閱:[左外連接vs不存在](http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/) – 2011-05-31 16:19:38