【问题标题】:Best way to Sort-n-Concatenate 5 columns排序n连接5列的最佳方法
【发布时间】:2011-02-18 08:17:32
【问题描述】:

!!!警告!!!

亲爱的SQL专家,请继续阅读之前开始尖叫。 这个超级非规范化的表结构是 应用一些后获得 很好地标准化的组合糖 数据集:)。我避免 重新规范化这个结果集,因为我 想要保持简单完整 过程(也不会使用此数据 在应用程序的另一个位置)。 (是的,Codd。我知道你在想什么)。


有五列包含数值

 A | B | C | D | E
-------------------
 2 | 3 | 4 | 1 | 5
 3 | 6 | 1 | 5 | 4
 4 | 5 | 7 | 1 | 3

我想在排序后获得值的串联:

   ABCDE
-----------
 1 2 3 4 5
 1 3 4 5 6
 1 3 4 5 7

最好的方法是什么?

【问题讨论】:

  • 我不明白。 SQL 中的排序是按行完成的。您是否真的在尝试对列进行排序?因为这是严重设计缺陷的标志。
  • 您可以在一组荒谬的 CASE 语句中写出 5 列排序...但我同意 @Aaronaught。
  • @AaronNaught 这个表结构是在对一组标准化数据应用一些组合糖后获得的:)。我避免重新规范化这个结果集,因为我想保持简单的过程(这些数据也不会在应用程序的其他地方使用:)
  • 有时,对于这种奇怪的情况,在客户端执行处理比在 SQL Server 上更容易。您能否将排序转移到您的客户端应用程序中?
  • 嗨 Juliet,不,在这种情况下应该在 SQL 端完成 :)

标签: sql sql-server sql-server-2008 sorting


【解决方案1】:

回顾一下为什么需要这样做的严肃问题,尽管很尴尬,但还是可以实现:

Select ...
    , Stuff(
            (
            Select ' ' + Z.Col
            From    (
                    Select PKCol, A As Col From Table
                    Union All Select PKCol, B From Table
                    Union All Select PKCol, C From Table
                    Union All Select PKCol, D From Table
                    Union All Select PKCol, E From Table
                    ) As Z
            Where Z.PKCol = Table.PKCol
            Order By Col
            For Xml Path('')
            ), 1, 1, '') As Combined
From Table

显然,数据库从未设计为跨列排序,这就是解决方案难以实现的原因。

【讨论】:

  • 嗨,托马斯!是的,我同意。这是非正统的。但这只是为了保持组合过程简单(不会在家里尝试):) +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 2017-09-14
  • 2016-06-27
  • 1970-01-01
相关资源
最近更新 更多