2011-05-31 38 views
4

我一直在做的是查找A中沒有B中相關行的行,FK在B上?

SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL 

基本上,我試圖找到沒有關聯b,如果外國密鑰存儲在ba行。這是做到這一點的正確方式,還是有不同類型的加入來做到這一點?

回答

5

是的,這是正常的方式,我不知道更好的方法。

7

您正在尋找NOT EXISTS

SELECT 
    * 
FROM 
    a 
WHERE 
    NOT EXISTS (SELECT 1 FROM b WHERE a_id = a.id) 

有上b.a_id索引幫助這個查詢的性能。

+0

如果桌子很大,這將會很慢...... – 2011-05-31 16:14:24

+2

@Denis:當然不是。當有'b.a_id'索引時,這個速度會非常快。 – Tomalak 2011-05-31 16:15:38

+4

+1 - 另請參閱:[左外連接vs不存在](http://sqlinthewild.co.za/index.php/2010/03/23/left-outer-join-vs-not-exists/) – 2011-05-31 16:19:38

2

你可以嘗試

Select * from a where a.id not in (Select a_id from b) 
+0

同意 – 2011-05-31 16:13:20

+0

@Andrea Girardi:首先,它應該是('select a_id from b'),除此之外,如果從子查詢返回的值中有'NULL',這將失敗。 – Tomalak 2011-05-31 16:18:13

+0

@Tomalak耶! ;) – 2011-05-31 16:19:21

1

前面三種迴應是正確的,在這一點上我想你可以considere三個類型的查詢性能。你可以看看這個網址:

http://rockycode.com/blog/not-vs-outer-join-performance/

在我看來我覺得外部聯接是最好的方式,如果你沒有太多的行,三路都或多或少平等。

相關問題