You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

逻辑说明:

  1. 子查询中通过UNION ALL将发票和退货数据整合成一个统一结构的临时表:
    • 发票记录保留INV_VALUE,Return_VALUE设为NULL
    • 退货记录保留Return_VALUE,INV_VALUE设为NULL
  2. 将临时表与Client表左连接,保证所有客户(包括无发票/退货的ADAM)都能被展示
  3. 最终结果会按预期分别列出每条发票、每条退货,以及无交易记录的客户行

验证结果:

执行该语句后,将得到你预期的输出:

NAME_CLIENTNUM_CLIENTINV_VALUEReturn_VALUE
ALEX11000null
ALEX12000null
ALEX1null300
ALEX1null400
ADAM2nullnull

内容的提问来源于stack exchange,提问作者abou yahya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 15:40:37