如何在mysql中執行真正的左外連接?看起來它的左外連接包括內連接。我需要查找表a
中不在表b
中的記錄。
我能想出是真正的左外連接
select * from `a` where `a`.`index` not in (select `index` from `b`)
,最好是有什麼更優化的方式?沒有子查詢也許?
如何在mysql中執行真正的左外連接?看起來它的左外連接包括內連接。我需要查找表a
中不在表b
中的記錄。
我能想出是真正的左外連接
select * from `a` where `a`.`index` not in (select `index` from `b`)
,最好是有什麼更優化的方式?沒有子查詢也許?
這是你會怎麼做它瓦特/左連接:
select *
from `a`
left outer join `b`
on `a`.`index` = `b`.`index`
where `b`.`index` is null
我同意這種做法,但我已經被多個DBA告知,以避免這種類型的查詢 - 與數據庫引擎無法正確優化的方式有關,因此性能受到影響。我不知道這是否是真實的,但是至少應該對其他方法進行一些性能測試。 –
@Joe,它真的取決於數據庫... MySql對於子查詢也不是很好,所以我不認爲這太重要了。 – jswolf19
@ jswolf19:這很有道理。我的建議來自SQL Server和Oracle數據庫管理員,但是我發現MySQL的優化器的行爲不同。 –
的可能重複[需要SQL查詢找到父記錄沒有子記錄的(http://stackoverflow.com/questions/6839500/need-sql-query-to-find-parent-records-without-child-records) – Phil
你所描述的不是左外連接。無論表「b」中是否有匹配的記錄,左連接都包含表「a」中的所有記錄。 –
我建議使用'not exists'而不是'in'。 – jswolf19