我有两个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
公元前和公元前
3条答案
按热度按时间k7fdbhmy1#
这是一种痛苦,因为您需要枚举这两个表,然后
join
或聚合。有一种方法:crcmnpdw2#
我将给出一个您可能不喜欢的答案:这不应该在sql中完成。这是演示/展示问题。
在向用户显示数据的层中执行这种工作,而不是在sql后端。他们在网页上查吗?然后让网页获取原始数据,并根据需要进行格式化-让它将每天的收据或发票的内容放在不同的分区中。sql是否正在发送包含此数据的电子邮件?然后不要让它生成纯文本电子邮件—让它生成html并将数据放入表格单元格(这样就不必在两组数据之间协调行,因为数据量可能不同)
你真的不想玩这样的游戏,试图让sql输出在sql中看起来很漂亮。因为,老实说,你接受的答案中的代码可能是正确的,但我不想多年来一直维护它。。。
klh5stk13#
既然您只需要不同的记录,为什么不在联接两个表之后执行一个不同的操作呢?