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

如何正确执行Left Join并合并多值DOC_NUMBER避免结果重复

解决SQL Left Join后合并重复关联字段的问题

SQL Server 解决方案

从你使用的GO批处理命令推测,你使用的是SQL Server数据库。可以通过STRING_AGG()聚合函数,将同一分组下的DOC_NUMBER值用连字符-拼接,避免SC1的行重复。修改后的SQL语句如下:

SELECT 
    SC1.COMPANY,
    SC1.PEDIDO,
    SC1.ITEM_NUMBER,
    SC1.VALUE,
    STRING_AGG(SD1.DOC_NUMBER, '-') AS [DOC NUMBER]
FROM SC1
LEFT JOIN SD1 
    ON SC1.COMPANY = SD1.COMPANY
    AND SC1.PEDIDO = SD1.PEDIDO
    AND SC1.ITEM_NUMBER = SD1.ITEM_NUMBER
GROUP BY 
    SC1.COMPANY,
    SC1.PEDIDO,
    SC1.ITEM_NUMBER,
    SC1.VALUE;
GO

关键说明

  • STRING_AGG()是SQL Server 2017及以上版本支持的函数,专门用于将分组内的字符串值拼接为单个字符串。
  • 分组字段必须包含SC1中所有需要保持唯一的字段(COMPANY、PEDIDO、ITEM_NUMBER、VALUE),确保SC1的每一行仅输出一次。
  • 若SD1无匹配数据,STRING_AGG()会返回NULL,如需替换为空字符串,可改为ISNULL(STRING_AGG(SD1.DOC_NUMBER, '-'), '')。

其他数据库适配方案

如果使用其他数据库,对应的字符串聚合函数不同:

  • MySQL/MariaDB:使用GROUP_CONCAT()函数
SELECT 
    SC1.COMPANY,
    SC1.PEDIDO,
    SC1.ITEM_NUMBER,
    SC1.VALUE,
    GROUP_CONCAT(SD1.DOC_NUMBER SEPARATOR '-') AS `DOC NUMBER`
FROM SC1
LEFT JOIN SD1 
    ON SC1.COMPANY = SD1.COMPANY
    AND SC1.PEDIDO = SD1.PEDIDO
    AND SC1.ITEM_NUMBER = SD1.ITEM_NUMBER
GROUP BY 
    SC1.COMPANY,
    SC1.PEDIDO,
    SC1.ITEM_NUMBER,
    SC1.VALUE;
  • Oracle:使用LISTAGG()函数
SELECT 
    SC1.COMPANY,
    SC1.PEDIDO,
    SC1.ITEM_NUMBER,
    SC1.VALUE,
    LISTAGG(SD1.DOC_NUMBER, '-') WITHIN GROUP (ORDER BY SD1.DOC_NUMBER) AS "DOC NUMBER"
FROM SC1
LEFT JOIN SD1 
    ON SC1.COMPANY = SD1.COMPANY
    AND SC1.PEDIDO = SD1.PEDIDO
    AND SC1.ITEM_NUMBER = SD1.ITEM_NUMBER
GROUP BY 
    SC1.COMPANY,
    SC1.PEDIDO,
    SC1.ITEM_NUMBER,
    SC1.VALUE;

内容的提问来源于stack exchange,提问作者Daniel Gatti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:25:53