代码之家  ›  专栏  ›  技术社区  ›  m7d

如何只返回多次内部联接的行

  •  0
  • m7d  · 技术社区  · 15 年前

    我有两张桌子,一张是发票,一张是来账的。输入的付款可以通过类似这样的外键加入到发票中:

    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
    

    有什么想法吗?

    5 回复  |  直到 14 年前
        1
  •  1
  •   Rob Farley    15 年前

    我不知道为什么第一个没用…它真的应该是。你能再说一下“它不起作用”吗?

    尝试:

    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
    

    帮你弄清楚发生了什么事。

    罗布

        2
  •  1
  •   RC.    15 年前
    选择t0.docnum,count(*)
    从发票t0 inner join incoming_payments t1 on t0.receiptnum=t1.docentry
    按t0.docnum分组
    计数(*)>1
    
    
        3
  •  1
  •   Johnny Lamho    15 年前

    会出现什么SQL错误?是否按要求分组的所有字段分组?

        4
  •  0
  •   shahkalpesh    15 年前

    我认为您的示例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 t0.receiptnum = t1.docentry ?

    edit2:参见上面修改过的SQL。

        5
  •  0
  •   m7d    14 年前

    考虑到我使用的模式,答案最终变得更加复杂。我不包括这里的实际代码,但我不久前解决了这个问题。只是想跟进,感谢大家的帮助。