当左联接返回 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

您也可以通过检查 NULL 值让 WHERE 来处理它,但恕我直言,最好尽快执行过滤器。

这里的问题是,通过应用LEFT JOINWHERE过滤器,LEFT JOIN失败的条件返回 NULL for vlu.status ,然后在WHERE中过滤掉(因为条件是 vlu.status = 1 )。您需要更改以下任一内容:

WHERE ...
AND (vlu.status = 1 OR vlu.status IS NULL) -- NULL for the Left Join

或者将 vlu.status 筛选器移动到左联接条件中

LEFT JOIN vid_users vlu on vlu.id=la.user_id AND vlu.status = 1

更多关于这方面的信息

这里

coalesce 函数接受表达式列表并返回第一个不为 null 的结果。 您可以使用它将 null 替换为默认值:

coalesce(vlu.status = 1, true)