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;
代码说明
- 子查询聚合:每个子查询针对对应表,按
item_code分组并求和数量,确保每个item_code只返回一条汇总记录。 - LEFT JOIN:使用LEFT JOIN而非INNER JOIN,保证即使某个
item_code在某些表中没有记录,也能在结果中保留该item的信息,避免数据丢失。 - IFNULL处理空值:用
IFNULL(字段, 0)将空值替换为0,让结果更直观(如果不需要替换为0,可直接保留字段)。
内容的提问来源于stack exchange,提问作者Palak Padalia
相关产品推荐
相关产品推荐

