join 後的where你清楚嗎?

今天,在對兩張表進行left join時候,總是查詢少結果,並不是所要的答案,原來的語句:

select aa.RoomId, bb.SectionID from aa left join bb on aa.RoomId = bb.OldForumID 
where aa.del = 0 and bb.ParentID != '00000000'  and bb.IsDeleted = 'false' 
group by aa.RoomId, bb.SectionID

結果只顯示了276條,缺少了4條結果,這4條結果中的第二列SectionID 爲NULL;後來經頭提點,把語句改成:

select aa.RoomId, bb.SectionID from aa left join bb on aa.RoomId = bb.OldForumID 
and bb.ParentID != '00000000' and bb.IsDeleted = 'false' 
where aa.del = 0
group by aa.RoomId, bb.SectionID


這樣得出的結果正是我要的280條記錄,包括第二列SectionID 爲NULL的記錄。以上的查詢方式,你是否看出了點貓膩?貓膩就在 and bb.ParentID != '00000000'  這個條件是加在where之前還是之後,先說加在之後吧,之後是表示先對這兩張表進行了join,然後在此結果集中再進行where條件篩選,而在SQLServer中爲NULL值列的判斷就認爲是true了,所以那4條爲NULL的記錄就查詢不出來了;反而要是把那個條件加在了where子句之前,則是先對此條件進行篩選後再進行join,而本身表bb此字段是不會有NULL值的,這樣進行join後的值就會有第二列SectionID 爲NULL的記錄,也就是說查詢後的涉及到join後的那張表的字段的條件應該都在where之前加上。這樣想以後其實這條語句還可以修改爲:

select aa.RoomId, bb.SectionID from aa left join bb on aa.RoomId = bb.OldForumID 
where aa.del = 0 and (bb.ParentID is null or bb.ParentID != '00000000'
and (bb.IsDeleted is null or  bb.IsDeleted = 'false' )
group by aa.RoomId, bb.SectionID

不過,語句還不如上一個簡潔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章