T-SQL中STRING_AGG()拼接结果排序不符合预期问题求助
问题原因
- SQL Server 不保证派生表、子查询等表表达式的输出顺序,你在子查询中使用
TOP 100 PERCENT + ORDER BY的写法属于早期SQL Server 2000时代用来强制视图排序的hack,在SQL Server 2005及之后的版本中会被查询优化器判定为无意义的排序操作,执行时会直接忽略该ORDER BY子句,因此子查询的排序不会影响外层STRING_AGG的拼接顺序。 - STRING_AGG的拼接顺序默认没有固定规则,和外层、子查询的ORDER BY无关,必须使用其专属的
WITHIN GROUP排序语法指定拼接顺序才会生效。
解决方案
直接在STRING_AGG函数后添加WITHIN GROUP (ORDER BY ...)子句指定拼接时的排序规则,不需要在子查询中做无用的排序操作,甚至可以直接去掉冗余的子查询结构,优化执行效率。
修正后的完整查询代码如下:
SELECT [old_file], STRING_AGG(CONCAT([static_class],' ',[rotation]),' ') WITHIN GROUP (ORDER BY [old_file],[static_class]) AS [static_class] FROM [dbo].[Conversion_imageTiles] WHERE [old_file] = 'tileWeir-E-W-U-D.gif' GROUP BY [old_file] ORDER BY [old_file],[static_class]
上述写法可以严格保证拼接后的static_class字段内容完全按照你指定的字段顺序拼接,符合预期输出要求。
内容的提问来源于stack exchange,提问作者Morvael
相关产品推荐
相关产品推荐

