[英]'where' condition fails when left join returns null
當left join
失敗時,由於vlu.status=1
查詢不返回任何內容。 即使左連接失敗,我也想要結果。
如果我刪除vlu.status=1
然后它返回正確的結果,但是當左連接沒有失敗時我必須使用vlu.status=1
。
select vb.first_name,vb.last_name,DATE_FORMAT(vb.created_date,'%m-%d-%Y') as Created_On,
concat(la.first_name,' ',la.last_name) as Loan_Agent, vl.loan_number,
count(vs.id) as Num_Deliveries from vid_borrowers vb
inner join vid_loans vl on vl.borrower_id= vb.id
left join vid_delivery_schedules vs on vs.borrower_id = vb.id
left join vid_loan_agents la on la.id=vl.loan_officer_id
left join vid_users vlu on vlu.id=la.user_id
where vb.bank_id=6
AND STR_TO_DATE(vb.created_date, '%Y-%m-%d') between '2014-12-01' and '2014-12-16'
and vlu.status=1
group by vb.first_name, vb.last_name, la.first_name, la.last_name, vl.loan_number
將條件放在連接中並將其從WHERE子句中刪除; 這樣做會在WHERE參與之前條件失敗時創建一個NULL行。
...
left join vid_users vlu on vlu.id=la.user_id and vlu.status = 1
where vb.bank_id=6
AND STR_TO_DATE(vb.created_date, '%Y-%m-%d') between '2014-12-01' and '2014-12-16'
group by vb.first_name, vb.last_name, la.first_name, la.last_name, vl.loan_number
你可以讓WHERE通過檢查NULL值來處理它,但恕我直言,最好盡快執行過濾器。
這里的問題是,通過應用LEFT JOIN
和WHERE
過濾器, LEFT JOIN
失敗的條件為vlu.status
返回NULL,然后在WHERE
過濾掉(因為標准是vlu.status = 1
)。 您需要更改:
WHERE ...
AND (vlu.status = 1 OR vlu.status IS NULL) -- NULL for the Left Join
或者將vlu.status過濾器移動到LEFT JOIN條件
LEFT JOIN vid_users vlu on vlu.id=la.user_id AND vlu.status = 1
coalesce
函數獲取表達式列表並返回非null的第一個結果。 您可以使用它來使用默認值替換空值:
coalesce(vlu.status = 1, true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.