如何正确执行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
相关产品推荐
相关产品推荐

