首页 > 解决方案 > 连接表中不存在记录时 SQL 不显示行

问题描述

我有一个客户表、付款表和调用表

我想返回由大部分客户列表组成的行,最后一次付款的日期和金额以及最后一次通话的日期。

我编写了一个几乎(所以根本不)有效的查询..只要连接表上存在付款和通话,它就可以按预期工作。如果一个或另一个不存在,则查询不会返回一行。

我想要的是无论付款和通话数据如何都返回的客户数据。

SELECT clientlist.ID, clientlist.FirstName, clientlist.LastName, clientlist.`Herd Number`, clientlist.Address1, clientlist.Address2, clientlist.Address3, clientlist.County, 
clientlist.postcode, clientlist.Mobile, clientlist.AuditDue AS `Cert Expiry`,p1.dateofpayment,p1.amt ,c1.dateofcall, a1.link,a1.dateOfAudit

FROM agritxtdev.clientlist left join payments p1 

on clientlist.ID=p1.clientnum 

left join calls c1

on clientlist.id= c1.clientnum left join auditdate a1 on a1.client = clientlist.id

where p1.id = (Select MAX(id) from payments p2 where p1.clientnum=p2.clientnum) 

AND c1.id= (Select MAX(id) from calls c2 where c1.clientnum=c2.clientnum) 

order by clientlist.ID

我真的很乐意为您提供任何帮助。

我相当确定我的问题在这里,但我迷失了另一种方法

where p1.id = (Select MAX(id) from payments p2 where p1.clientnum=p2.clientnum) 

AND c1.id= (Select MAX(id) from calls c2 where c1.clientnum=c2.clientnum) 

在此先感谢彼得

标签: mysqlsqljoinleft-joinwhere-clause

解决方案


实际上,问题在于where条款中的条件。基本上,您需要将它们移动到on相应连接的子句中。否则条件是强制性的,并过滤掉left join不匹配的行:

select ...
from agritxtdev.clientlist 
left join payments p1 
    on  clientlist.id=p1.clientnum 
    and p1.id = (select max(id) from payments p2 where p1.clientnum=p2.clientnum) 
left join calls c1 
    on  clientlist.id= c1.clientnum 
    and c1.id= (select max(id) from calls c2 where c1.clientnum=c2.clientnum) 
left join auditdate a1 
    on  a1.client = clientlist.id
order by clientlist.id

推荐阅读