簡體   English   中英

當left join返回null時,'where'條件失敗

[英]'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 JOINWHERE過濾器, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM