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
相关产品推荐
相关产品推荐

