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

MariaDB多表连接重复记录问题:按Item唯一展示数据

问题原因

你遇到的重复记录是因为直接关联了未做聚合的多表,当同一个item_code在多个关联表中存在多条记录时,会产生笛卡尔积,导致结果被多次重复输出。

解决方案

先对每个表按item_code聚合计算总数量,再将聚合后的结果与主表关联,这样每个item_code只会返回一条记录。

修正后的SQL代码如下:

SELECT
    i.item_code,
    IFNULL(sed.opening_qty, 0) AS opening,
    IFNULL(pri.purchase_qty, 0) AS purchase,
    IFNULL(issue.issue_qty, 0) AS issue,
    IFNULL(bin.bin_qty, 0) AS bin
FROM `tabItem` i
LEFT JOIN (
    -- 聚合Material Receipt类型的库存入数量
    SELECT item_code, SUM(qty) AS opening_qty
    FROM `tabStock Entry Detail`
    WHERE stock_entry_type = 'Material Receipt'
    GROUP BY item_code
) sed ON i.item_code = sed.item_code
LEFT JOIN (
    -- 聚合采购收货数量
    SELECT item_code, SUM(qty) AS purchase_qty
    FROM `tabPurchase Receipt Item`
    GROUP BY item_code
) pri ON i.item_code = pri.item_code
LEFT JOIN (
    -- 聚合Material Issue类型的库存出数量
    SELECT item_code, SUM(qty) AS issue_qty
    FROM `tabStock Entry Detail`
    WHERE stock_entry_type = 'Material Issue'
    GROUP BY item_code
) issue ON i.item_code = issue.item_code
LEFT JOIN (
    -- 聚合Bin中的实际数量
    SELECT item_code, SUM(actual_qty) AS bin_qty
    FROM `tabBin`
    GROUP BY item_code
) bin ON i.item_code = bin.item_code;
代码说明
  1. 子查询聚合:每个子查询针对对应表,按item_code分组并求和数量,确保每个item_code只返回一条汇总记录。
  2. LEFT JOIN:使用LEFT JOIN而非INNER JOIN,保证即使某个item_code在某些表中没有记录,也能在结果中保留该item的信息,避免数据丢失。
  3. IFNULL处理空值:用IFNULL(字段, 0)将空值替换为0,让结果更直观(如果不需要替换为0,可直接保留字段)。

内容的提问来源于stack exchange,提问作者Palak Padalia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:40:37