MySQL多表左连接结果重复,如何获取预期查询结果?
解决方案
你的问题根源在于连续左连接会让Invoice和Sales returns表的记录产生笛卡尔积,导致同一发票/退货记录被重复关联,从而出现重复数据。要实现发票与退货记录分别单独展示的效果,可以通过**UNION ALL合并两个子查询结果**的方式来处理,具体SQL语句如下:
SELECT c.NAME_CLIENT, c.NUM_CLIENT, t.INV_VALUE, t.Return_VALUE FROM Client c LEFT JOIN ( -- 提取所有发票记录,退货字段设为null SELECT NUM_CLIENT_INV AS client_id, INV_VALUE, NULL AS Return_VALUE FROM Invoice UNION ALL -- 提取所有退货记录,发票字段设为null SELECT NUM_CLIENT_SR AS client_id, NULL AS INV_VALUE, Return_VALUE FROM `Sales returns` ) t ON c.NUM_CLIENT = t.client_id;
逻辑说明:
- 子查询中通过
UNION ALL将发票和退货数据整合成一个统一结构的临时表:- 发票记录保留
INV_VALUE,Return_VALUE设为NULL - 退货记录保留
Return_VALUE,INV_VALUE设为NULL
- 发票记录保留
- 将临时表与
Client表左连接,保证所有客户(包括无发票/退货的ADAM)都能被展示 - 最终结果会按预期分别列出每条发票、每条退货,以及无交易记录的客户行
验证结果:
执行该语句后,将得到你预期的输出:
| NAME_CLIENT | NUM_CLIENT | INV_VALUE | Return_VALUE |
|---|---|---|---|
| ALEX | 1 | 1000 | null |
| ALEX | 1 | 2000 | null |
| ALEX | 1 | null | 300 |
| ALEX | 1 | null | 400 |
| ADAM | 2 | null | null |
内容的提问来源于stack exchange,提问作者abou yahya
相关产品推荐
相关产品推荐

