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

Azure SQL Server中GROUP BY多文档过滤返回重复行问题求助

问题现象

使用GROUP BY按文档号(VBELN)和行项目(POSNR)分组去重时,单文档过滤能返回正确的唯一组合,但多文档查询或移除过滤条件后,会出现重复的VBELN+POSNR行。尝试过ROW_NUMBER()分区去重、转换POSNR为INT后分组,均未解决问题,数据库为Azure SQL Server。

复现SQL

单文档查询(正常返回3行)

SELECT   
    lp.[VBELN]
   ,lp.[POSNR]
FROM SAPECC.LIPS lp
WHERE lp.[VBELN] IN ('2122898111')
GROUP BY lp.[VBELN], lp.[POSNR]
ORDER BY lp.[VBELN] DESC, lp.[POSNR]

多文档查询(出现重复行)

SELECT   
    lp.[VBELN]
   ,lp.[POSNR]
FROM SAPECC.LIPS lp
WHERE lp.[VBELN] IN ('2122898111', '2122731545')
GROUP BY lp.[VBELN], lp.[POSNR]
ORDER BY lp.[VBELN] DESC, lp.[POSNR]
原因分析及排查解决

核心可能原因

  1. 隐性字符差异:VBELN或POSNR字段存在肉眼不可见的字符(如空格、制表符、换行符)。单文档过滤时,过滤条件精确匹配包含隐性字符的行,分组逻辑不会混淆;多文档查询时,同一VBELN+POSNR标识的行可能因隐性字符差异被判定为不同分组。
  2. 排序规则限制:数据库或字段使用二进制排序规则时,字符串的大小写、空格会被严格区分,导致相同视觉内容的字符串被视为不同值。
  3. 索引/数据页异常:Azure SQL Server的索引或数据页存在损坏,导致分组逻辑出现偏差。

排查步骤

  1. 检查字段实际内容与长度:
    对比LEN()(字符长度)和DATALENGTH()(字节长度),同时输出十六进制值查看隐性字符:

    SELECT 
        lp.[VBELN],
        lp.[POSNR],
        LEN(lp.[VBELN]) AS vbeln_char_len,
        DATALENGTH(lp.[VBELN]) AS vbeln_byte_len,
        LEN(lp.[POSNR]) AS posnr_char_len,
        DATALENGTH(lp.[POSNR]) AS posnr_byte_len,
        CONVERT(VARBINARY(MAX), lp.[VBELN]) AS vbeln_hex,
        CONVERT(VARBINARY(MAX), lp.[POSNR]) AS posnr_hex
    FROM SAPECC.LIPS lp
    WHERE lp.[VBELN] = '2122898111' AND lp.[POSNR] = '000010'
    

    若DATALENGTH()与LEN()结果不一致,或十六进制值不同,说明存在隐性字符差异。

  2. 检查数据库排序规则:

    SELECT name, collation_name FROM sys.databases WHERE name = '你的数据库名称';
    

    若排序规则含BIN(二进制)或CS(区分大小写)标识,会导致严格的字符串匹配。

解决方法

  1. 清理隐性字符:
    使用LTRIM(RTRIM())清理首尾空格,或替换非打印字符后再分组:

    SELECT   
        LTRIM(RTRIM(lp.[VBELN])) AS VBELN,
        LTRIM(RTRIM(lp.[POSNR])) AS POSNR
    FROM SAPECC.LIPS lp
    WHERE lp.[VBELN] IN ('2122898111', '2122731545')
    GROUP BY LTRIM(RTRIM(lp.[VBELN])), LTRIM(RTRIM(lp.[POSNR]))
    ORDER BY VBELN DESC, POSNR
    

    如需移除换行/制表符,可嵌套REPLACE:

    REPLACE(REPLACE(lp.[POSNR], CHAR(10), ''), CHAR(13), '')
    
  2. 强制统一排序规则:
    分组时指定不区分大小写和空格的排序规则:

    SELECT   
        lp.[VBELN],
        lp.[POSNR]
    FROM SAPECC.LIPS lp
    WHERE lp.[VBELN] IN ('2122898111', '2122731545')
    GROUP BY lp.[VBELN] COLLATE SQL_Latin1_General_CP1_CI_AS, lp.[POSNR] COLLATE SQL_Latin1_General_CP1_CI_AS
    ORDER BY lp.[VBELN] DESC, lp.[POSNR]
    
  3. 重建索引修复异常:
    若怀疑索引或数据页问题,重建表的所有索引:

    ALTER INDEX ALL ON SAPECC.LIPS REBUILD;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:47:49