2010-05-24 34 views
1

我有一个表,它看起来像多列排序(SQL Server 2005中)

Col1 col2 col3 col4 col5 
1 5  1  4  6 
1 4  0  3  7  
0 1  5  6  3 
1 8  2  1  5 
4 3  2  1  4 

剧本是

declare @t table(col1 int, col2 int, col3 int,col4 int,col5 int) 
insert into @t 
select 1,5,1,4,6 union all 
select 1,4,0,3,7 union all 
select 0,1,5,6,3 union all 
select 1,8,2,1,5 union all 
select 4,3,2,1,4 

我想要的输出为每列按升序进行排序,即

Col1 col2 col3 col4 col5 
    0 1  0  1  3 
    1 3  1  1  4 
    1 4  2  3  5 
    1 5  2  4  6 
    4 8  5  6  7 

我已经受如下因素程序解决了这个问题

Select 
    x1.col1 
    ,x2.col2 
    ,x3.col3 
    ,x4.col4 
    ,x5.col5 
From (Select Row_Number() Over(Order By col1) rn1, col1 From @t)x1 
Join(Select Row_Number() Over(Order By col2) rn2, col2 From @t)x2 On x1.rn1=x2.rn2 
Join(Select Row_Number() Over(Order By col3) rn3, col3 From @t)x3 On x1.rn1=x3.rn3 
Join(Select Row_Number() Over(Order By col4) rn4, col4 From @t)x4 On x1.rn1=x4.rn4 
Join(Select Row_Number() Over(Order By col5) rn5, col5 From @t)x5 On x1.rn1=x5.rn5 

但我对此解决方案并不满意。

有没有更好的方法来实现? (使用基于集合的方法)

如果是这样,任何人都可以请示例。

感谢

+1

你能解释一下你为什么要这样做吗?这将表明你的数据库的设计也许不是最佳的... – 2010-05-24 04:24:43

+3

我怀疑你会更好,询问你正在尝试做整个事情... – 2010-05-24 04:44:27

+0

发售的声誉不会帮助解决一些东西,基本上是无法解决的,由于要求。你应该接受建议,即你正在尝试做的事情是根本错误的。 – 2010-05-28 03:51:50

回答

4

你正在试图做会“撕开”,你收到了该行的排序 - 不是你应该在关系数据库中做....

例如在原始表格中的最后一行,你有一个元组(4,3,2,1,4) - 但突然,你要找的结果,你有一个元组(4,8,5,6,7) 。

这很奇怪,并且与处理数据的每一种“通常”方式相矛盾。 RDBMS通常具有数据的元组(行),您可以通过任意数量的列对这些元素进行排序 - 但在排序操作后您不能突然创建新的元组。非常奇怪....

我建议你重新考虑你这样做的整个策略 - 这感觉很奇怪,与我知道的任何通常的数据库原则不一致.....究竟是什么(以及为什么)你想达到这个目标吗?似乎你真的在处理一系列不同的数据 - 那么为什么不把这些不同的数据块放到他们自己的表中,如果他们真的没有任何关系呢?

0

我总是同意其他人。纯粹作为一种思维练习,我试图解决如何做到这一点,并意识到任何我想出来的东西都会非常像你不满意的解决方案。

您必须将表格拆分为每列一个表格,对这些列进行排序,然后通过加入排序顺序来形成新列 - 这正是您所做的。我没有看到这样的捷径,因为如前所述,关系数据库(更不用说关系数据库理论)根本没有被设计为支持你的“老年人”希望你执行的元组(行)的操作类型。 (一)让他们正确或(b)聪明(或)(b)聪明。

1

(这听起来像这可能是从已导入但列没有正确排序独立栏的试算结果...?)

我同意这听起来像一个奇怪的要求,因为它是打破同一行中值之间的联系。正常情况下,同一行中的值具有强行逻辑绑定,该行由行描述的实体定义。将它们分开,并在隔离取值通常使信息毫无意义,或显示数据并不需要存储在一起,开始用表。如果后者是这种情况,那么该表格将更有用,可拆分为多个表格。

而且这是因为RDBMS模型从根本上想从你必须掰开表为你做同一行返回值。在结构上,没有其他选择 - 只有不同的方式来编写查询才能获得相同的结果。

我可以说,我想你已经写了一个很好的查询 - 我采访了许多候选人你谁也无法解决了这个问题。对于你能够做你的工作,你的工作,老年人应至少向你解释为什么数据是这样的,以及是否更改表结构是一个选项,如果这将带来显著改善系统。