避免使用东西功能和xml路径重复

时间:2019-03-25 15:56:09

标签: sql sql-server for-xml-path

我在使用具有填充功能的mysql服务器时出现重复项问题。该数据库包含数百万条记录,并且使用不重复是不可能的(似乎查询甚至没有处理)。

这是我的数据库结构:

PersonID    Freetext    Importance
PersonID    Freetext    Importance
PersonID    Freetext    Importance
PersonID    Freetext    Importance
PersonID    Freetext    Importance

我一直在使用以下结构进行此查询。该查询工作正常(关于填充函数),但它返回重复项。例如,如果有五个ID相同,则查询返回五行:

SELECT PersonID, Importance, Freetext = STUFF(
             (SELECT '~' + Freetext
              FROM TABLE t1
              WHERE t1.PersonID = t2.PersonID
              FOR XML PATH (''))
             , 1, 1, '') from TABLE t2
group By PersonID, Importance
order by Importance

如何避免这种情况?

我希望将属于同一PersonID的所有自由文本填充到同一行中,对填充进行排序,以使重要性最低的行将其自由文本首先填充。

1 个答案:

答案 0 :(得分:2)

只是猜测(不能在不知道数据或源数据的情况下确定是否能获得所需的结果),但是如果要FOR XML PATH按重要性顺序(最小到最大)列出值,则需要移动ORDER BY

SELECT PersonID, [Freetext] = STUFF(
       (SELECT '~' + Freetext
          FROM dbo.[TABLE] AS t1
          WHERE t1.PersonID = t2.PersonID
          ORDER BY Importance
          FOR XML PATH ('')
       ), 1, 1, '') 
FROM dbo.[Table] AS t2
GROUP BY PersonID;

如果您想以某种方式包括重要性,则需要将其与自由文本连接;在外部查询或“分组依据”中没有意义(按重要性分组实际上是导致重复项的原因)。

如果需要防止自由文本出现重复值,则需要在子查询中添加分组。但这也变得很复杂。如果您有两个相同的自由文本值,但输入的重要性不同怎么办?您丢弃重要性较高还是较低的一个?

回到最初的问题,在SQL Server 2017及更高版本上,您可以使用更简单(更有效)的结构:

SELECT PersonID,  
       [Freetext] = STRING_AGG([Freetext],'~') WITHIN GROUP (ORDER BY Importance)
  FROM dbo.[Table]
  GROUP BY PersonID;