sql只连接到一行

smtd7mpg  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(429)

我有两个sale数据表,没有公共键,只有sale date和customer name。我想连接它们,以便表a中的每一行最多有一个表b中的匹配项,如果没有找到,则为0。问题是如果同一个客户在同一天出现两次。如果我有这样的数据

Table A                             Table B

Customer | Date       | Receipt     Customer | Date       | Invoice
===============================     ===============================
John     | 2018-01-01 | A           John     | 2018-01-01 | C
John     | 2018-01-01 | B           John     | 2018-01-01 | D

我怎么得到这个

Result

Customer | Date       | Receipt | Invoice
=========================================
John     | 2018-01-01 | A       | C
John     | 2018-01-01 | B       | D

收据a是否与发票c或d匹配并不重要,只要每个都配对一次。目前我的查询连接了所有这些,ac,ad,bc,bd
编辑:澄清一下,两个表中都不能有重复项。一张发票和收据只能出现一次。所以这些结果中的任何一个都是可以接受的:
ac和bd
公元前和公元前

k7fdbhmy

k7fdbhmy1#

这是一种痛苦,因为您需要枚举这两个表,然后 join 或聚合。有一种方法:

select customer, date, max(receipt) as receipt, max(invoice) as invoice
from ((select a.customer, a.date, a.receipt,
              (@rnr := if(@cd = concat_ws(';', customer, date), @rnr + 1,
                          if(@cd := concat_ws(';', customer, date), 1, 1)
                         )
              ) as seqnum
       from a cross join
            (select @rnr := 0, @cd := '') params
       order by a.customer, a.date
      ) union all
      (select b.customer, b.date, b.invoice,
              (@rni := if(@cd = concat_ws(';', customer, date), @rni + 1,
                          if(@cd := concat_ws(';', customer, date), 1, 1)
                         )
              ) as seqnum
       from b cross join
            (select @rni := 0, @cd := '') params
       order by a.customer, a.date
      )
     ) cd
group by customer, date, seqnum;
crcmnpdw

crcmnpdw2#

我将给出一个您可能不喜欢的答案:这不应该在sql中完成。这是演示/展示问题。
在向用户显示数据的层中执行这种工作,而不是在sql后端。他们在网页上查吗?然后让网页获取原始数据,并根据需要进行格式化-让它将每天的收据或发票的内容放在不同的分区中。sql是否正在发送包含此数据的电子邮件?然后不要让它生成纯文本电子邮件—让它生成html并将数据放入表格单元格(这样就不必在两组数据之间协调行,因为数据量可能不同)
你真的不想玩这样的游戏,试图让sql输出在sql中看起来很漂亮。因为,老实说,你接受的答案中的代码可能是正确的,但我不想多年来一直维护它。。。

klh5stk1

klh5stk13#

既然您只需要不同的记录,为什么不在联接两个表之后执行一个不同的操作呢?

SELECT DISTINCT a.Customer,
a.Date, 
a.Receipt, 
b.Invoice 
FROM Table_A a

JOIN Table_B b
ON a.Customer = b.Customer
AND a.Date = b.Date

相关问题