mysql—当联接表中不存在记录时,sql不显示行

w6lpcovy  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(377)

我有一个clientlist表,一个payments表和一个calls表
我想返回一个由clientlist表的大部分组成的行,最后一次付款的日期和金额,以及最后一次通话的日期。
我写了一个查询,几乎(所以一点也不)起作用。。只要联接表上存在支付和调用,它就可以正常工作。如果其中一个不存在,则查询不返回行。
我想要的是客户数据返回无论付款和通话数据。

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)

提前谢谢彼得

slsn1g29

slsn1g291#

事实上,问题出在 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
9avjhtql

9avjhtql2#

我建议改变方法,这不仅是你的问题,也是一个非常浪费的过程。
试试这个:

select max(Id) 'IdPay' into #tempPayments from payments group by clientnum
select max(Id) 'IdCalls' into #tempCalls from calls group by clientnum

SELECT your_fields
FROM agritxtdev.clientlist left join #tempPayments p1 
on (clientlist.ID = p1.IdPay OR p1.IdPay IS NULL)
left join #tempCalls c1 on (clientlist.id= c1.IdCalls or c1.IdCalls IS NULL)
left join auditdate a1 on a1.client = clientlist.id

drop table #tempCalls
drop table #tempPayments

相关问题