【问题标题】:SQL Not Showing Rows when no record exists in a joined table连接表中不存在记录时 SQL 不显示行
【发布时间】:2020-07-30 20:06:46
【问题描述】:

我有一个客户列表、付款表和电话表

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

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

我想要的是不管支付和通话数据返回的客户数据。

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) 

提前感谢彼得

【问题讨论】:

  • 将这些条件移至on 子句。
  • 非常感谢……如此简单,但我的头因撞到桌子而受伤……
  • 请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com & 标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停整体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。

标签: mysql sql join left-join where-clause


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    试试这个:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多