http://www.cnblogs.com/huahua035/p/5718469.html
如上:一旦使用了left join,沒(méi)有where條件時(shí),左表table1會(huì)顯示全部?jī)?nèi)容
使用了where,只有滿足where條件的記錄才會(huì)顯示(左表顯示部分或者全部不顯示)
so。。。。
left join的困惑:一旦加上where條件,則顯示的結(jié)果等于inner join
原因分析:
數(shù)據(jù)庫(kù)在通過(guò)連接兩張或多張表來(lái)返回記錄時(shí),都會(huì)生成一張中間的臨時(shí)表,然后再將這張臨時(shí)表返回給用戶;
where條件是在臨時(shí)表生成好后,再對(duì)臨時(shí)表進(jìn)行過(guò)濾的條件;
因此:where 條件加上,已經(jīng)沒(méi)有l(wèi)eft join的含義(必須返回左邊表的記錄)了,條件不為真的就全部過(guò)濾掉。
解決方案:
1、where過(guò)濾結(jié)果作為子查詢,和主表left,如下:
select a.*,tmp.*from table1 aleft join( select a.*,b.* from table1 a left join table2 b on b.X=a.X where XXX)tmp
很明顯,子查詢語(yǔ)句無(wú)論 left join、inner join都沒(méi)啥區(qū)別了
2、查詢條件放在on后面
1 2 3 | select a.*,b.* from table1 a left join table2 b on b.X=a.X and XXX |
注意:where XXX去掉,改為鏈接條件on后面的 and XXX
分析:
on條件是在生成臨時(shí)表時(shí)使用的條件,它不管on中的條件是否為真,都會(huì)返回左邊表中的記錄。
結(jié)論:
過(guò)濾條件放在:
where后面:是先連接然生成臨時(shí)查詢結(jié)果,然后再篩選
on后面:先根據(jù)條件過(guò)濾篩選,再連 生成臨時(shí)查詢結(jié)果
聯(lián)系客服