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

SQL合并字段去重及排序问题:DISTINCT失效求助

解决SQL合并字段去重并按Sequence排序的问题

嘿,我瞅了下你的代码和问题——核心问题出在你把DISTINCT放错地方啦!你现在的写法是对整个拼接好的文本串去重,根本没处理单个Description的重复项。要实现合并字段时自动去重,同时还按Sequence排序,得换个思路:先把重复的描述干掉,再进行拼接。

修改后的完整代码

第一步:重构视图(实现去重+排序)

CREATE VIEW vwImageDescriptions AS
SELECT 
    i.ItemId,
    STUFF(ImageDescriptions.line, 1, 2, '') AS ImageDescriptions
FROM InventoryItems i
CROSS APPLY (
    SELECT 
        CAST((
            SELECT '; ' + p.Description 
            FROM (
                -- 先给每个ItemId下的描述去重,同时保留最小的Sequence用来排序
                SELECT DISTINCT 
                    ItemId, 
                    Description,
                    MIN(Sequence) AS MinSequence
                FROM Photos
                WHERE ItemId = i.ItemId
                AND Description IS NOT NULL 
                AND Description <> '' -- 过滤空描述,避免多余分号
                GROUP BY ItemId, Description
            ) p
            ORDER BY p.MinSequence -- 按原顺序排序
            FOR XML PATH('')
        ) AS nvarchar(max)) line
) ImageDescriptions
GO

第二步:查询视图获取结果

SELECT 
    i.ItemName, 
    id.ImageDescriptions 
FROM InventoryItems i
JOIN vwImageDescriptions id ON i.ItemId = id.ItemId
WHERE id.ImageDescriptions LIKE '%pla%'

为啥这么改?

  • 先去重再拼接:把去重逻辑移到内层的Photos子查询里,用GROUP BY ItemId, Description配合MIN(Sequence),既删掉了重复的描述,又保留了每个描述最早出现的顺序,保证排序和你原来的需求一致。
  • 过滤空值:加了AND Description IS NOT NULL AND Description <> '',避免空字符串被拼进去产生多余的; ,省得后续STUFF处理麻烦。
  • 调整DISTINCT的位置:原来的DISTINCT在外层,只能对最终的整串文本去重,现在移到内层,直接对单个描述去重,这才是你要的效果。

测试效果

用你给的测试数据,比如ItemId=315的记录,原本重复三次的My image会只显示一次,最终结果是From replacements.com; My image,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:23:44