2011-08-02 122 views
0

如何在mysql中執行真正的左外連接?看起來它的左外連接包括內連接。我需要查找表a中不在表b中的記錄。
我能想出是真正的左外連接

select * from `a` where `a`.`index` not in (select `index` from `b`) 

,最好是有什麼更優化的方式?沒有子查詢也許?

+0

的可能重複[需要SQL查詢找到父記錄沒有子記錄的(http://stackoverflow.com/questions/6839500/need-sql-query-to-find-parent-records-without-child-records) – Phil

+0

你所描述的不是左外連接。無論表「b」中是否有匹配的記錄,左連接都包含表「a」中的所有記錄。 –

+0

我建議使用'not exists'而不是'in'。 – jswolf19

回答

0

這是你會怎麼做它瓦特/左連接:

select * 
from `a` 
left outer join `b` 
on `a`.`index` = `b`.`index` 
where `b`.`index` is null 
+0

我同意這種做法,但我已經被多個DBA告知,以避免這種類型的查詢 - 與數據庫引擎無法正確優化的方式有關,因此性能受到影響。我不知道這是否是真實的,但是至少應該對其他方法進行一些性能測試。 –

+0

@Joe,它真的取決於數據庫... MySql對於子查詢也不是很好,所以我不認爲這太重要了。 – jswolf19

+0

@ jswolf19:這很有道理。我的建議來自SQL Server和Oracle數據庫管理員,但是我發現MySQL的優化器的行爲不同。 –