【问题标题】:How to return only rows that are inner-join'd more than once如何仅返回多次内连接的行
【发布时间】:2023-04-11 10:58:01
【问题描述】:

我有两张桌子,一张用于发票,一张用于收款。收款可以通过外键加入发票,如下所示:

from invoices t1 inner join incoming_payments t2 on t1.receiptnum = t2.docnum

问题:我想退回包含多于一笔付款的所有发票。对于每张发票,我想返回其 docnum,这只是发票的唯一 ID。

以下是我尝试过的一些方法,但没有奏效:

select t0.docnum
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
group by t0.docnum
having count(t0.docnum) > 1  

select t0.docnum
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry
group by t0.receiptnum, t0.docnum
having count(t0.receiptnum) > 1

有什么想法吗?

【问题讨论】:

    标签: sql sql-server join


    【解决方案1】:

    我不知道为什么第一个不起作用......它真的应该。你能扩展一下“它没有用”吗?

    试试:

    select t0.docnum, *
    from invoices t0 
      inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
    

    select t0.docnum, count(*)
    from invoices t0 
      inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
    group by t0.docnum
    

    帮助您弄清楚发生了什么。

    罗伯

    【讨论】:

    • 这很快,谢谢。第二个查询表明没有计数(*)> 1 的行,因为我提出了查询。同样,这将是一个有用的数据点。我需要更深入地研究架构,因为我知道有些发票包含不止一笔收款。
    • 当然。你解决了这个问题,你的第一个查询应该可以工作。不要按receiptnum分组,这永远行不通。
    【解决方案2】:
    选择 t0.docnum, count(*) 从发票 t0 内部加入incoming_payments t1 on t0.receiptnum = t1.docentry 按 t0.docnum 分组 计数(*)> 1

    【讨论】:

    • 谢谢,这个不返回任何行。所以这是我可以用来调试的另一个数据点。
    • 您无需返回 COUNT(*) 即可对其进行过滤。
    • 是的,我只是将其包含在内,以便他能够验证他的结果。
    【解决方案3】:

    您遇到什么 SQL 错误?您是否按需要分组的所有字段进行分组?

    【讨论】:

    • 没有错误,只是没有收到任何退回的发票,而且我有证据表明存在不止一笔收款的发票。我可能会用另一个可能涉及的表格来扩展我的问题。
    【解决方案4】:

    我认为您的示例 SQL 不一致(与您提供的第一个 SQL 相比)。
    即在第一个 SQL 中,您使用 docnum 进行比较,在随后的 SQL 中,您使用的是 docentry。

    select t0.docnum, count(t1.*)
    from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry
    group by t0.docnum
    having count(t1.*) > 1
    

    编辑:比较的匹配字段是什么?
    t0.receiptnum = t1.docnum OR t0.receiptnum = t1.docentry

    EDIT2:参见上面修改后的 SQL。

    【讨论】:

    • 是的——这就是为什么我希望他以“select *”开头。如果连接错误,那将非常明显。
    • 感谢您的提醒。那是我的打字错误。连接列是docentry。 docnum 只是发票中的另一列。
    【解决方案5】:

    考虑到我正在使用的架构,答案最终要复杂得多。我没有在这里包含实际代码,但我不久前解决了这个问题。只是想跟进并感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多