我在使用具有填充功能的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的所有自由文本填充到同一行中,对填充进行排序,以使重要性最低的行将其自由文本首先填充。
答案 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;