【问题标题】:FOR XML PATH Ignore Alphabetical OrderFOR XML PATH 忽略字母顺序
【发布时间】:2017-10-19 02:53:56
【问题描述】:

我正在使用here 找到的解决方案,但我需要忽略FOR XML PATH 中的排序。

样本数据为:

ID      DisplayName
1        Editor
1        Reviewer
7        EIC
7        Editor
7        Reviewer
7        Editor
19       EIC
19       Editor
19       Reviewer

而解的结果是:

ID      DisplayName
1        Editor, Reviewer
7        Editor, EIC, Reviewer
19       Editor, EIC, Reviewer

我需要找到一种方法来阻止 FOR XML PATH 排列字符串并按照以下确切顺序返回结果:

ID      DisplayName
1        Editor, Reviewer
7        EIC, Editor, Reviewer, Editor
19       EIC, Editor, Reviewer

更新:

我的桌子看起来像:

ID      DisplayName      Sequence
1        Editor           1
1        Reviewer         2
7        EIC              1
7        Editor           2
7        Reviewer         3
7        Editor           4
19       EIC              1
19       Editor           2
19       Reviewer         3

所以我希望它根据每个 ID 的顺序来组合字符串。

【问题讨论】:

  • 没有“确切”顺序,除非您指定在您的示例一列输出中生成排序的列。实际上,即使您当前看到的顺序也可能随时更改,SQL Server 可以随意使用它想要的任何顺序。
  • @TimBiegeleisen 感谢您的回复蒂姆,请查看我提出的问题的更新。
  • 戈登已经回答了你的问题。
  • @TimBiegeleisen 现在开始工作了。谢谢。

标签: sql sql-server


【解决方案1】:

SQL 表代表无序 集合。行中没有排序,除非列指定排序。因此,您不能让结果与原始行“以相同的顺序”,因为这个概念没有意义。

如果你有一个排序列,你可以使用:

SELECT id,
        STUFF( (SELECT ', ' + DisplayName
                FROM #t b 
                WHERE b.ID = a.ID
                ORDER BY b.Sequence
                FOR XML PATH('')
               ), 1, 2, ''
             ) as displaynames
FROM (SELECT DISTINCT ID FROM #t) a;

这里Sequence 是指定每个更新问题的排序的列。

【讨论】:

  • 我试过这个,但我没有工作。请参阅此 SQLFiddle sqlfiddle.com/#!6/b2e655/5。谢谢。
  • 我现在可以正常工作了,只是表名有一些错误。谢谢。
猜你喜欢
  • 2020-03-14
  • 1970-01-01
  • 2016-06-16
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2011-04-06
  • 2014-11-14
相关资源
最近更新 更多