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) 

提前感谢Peter

事实上,问题在于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

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

试试这个:

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

最新更新