Sql server 2005 多列排序(SQL Server 2005)

Sql server 2005 多列排序(SQL Server 2005),sql-server-2005,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) inser

我有一张桌子,看起来像

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
但我对这个解决方案不满意

有没有更好的方法实现同样的目标?(使用基于集合的方法)

如果是,请任何人举个例子


谢谢

您尝试执行的排序将“撕裂”您以前拥有的行,而不是您应该在关系数据库中执行的操作

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

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


我建议您重新考虑执行此操作的整个策略-这感觉非常奇怪,并且与我所知道的任何常规数据库原则都不一致。。。。。你到底想做什么(为什么要这么做)??看起来你真的在处理一组完全不同的数据——那么,如果这些数据块之间真的没有任何关系,为什么不把它们放在它们自己的表中呢???

你尝试的排序将“撕裂”你以前拥有的行,而不是你在关系数据库中应该做的事情

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

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


我建议您重新考虑执行此操作的整个策略-这感觉非常奇怪,并且与我所知道的任何常规数据库原则都不一致。。。。。你到底想做什么(为什么要这么做)??看起来你真的在处理一组完全不同的数据——那么,如果这些数据块之间真的没有任何关系,你为什么不把它们放在它们自己的表中呢???

我完全同意其他人的看法。纯粹作为一种思考练习,我试图弄清楚如何做到这一点,并意识到我提出的任何解决方案都非常类似于您不满意的解决方案

您必须将表拆分为每列一个表,对这些列进行排序,然后通过按排序顺序联接来形成新列,这正是您要做的。我看不到这方面的捷径,因为正如前面所说的,关系数据库(更不用说关系数据库理论)的设计根本不支持“前辈”希望您执行的元组(行)操作


记住,仅仅因为他们比你大,比你有“工作资历”,而且(显然)做这件事的时间比你长,(a)使他们正确或(b)聪明。

我完全同意其他人的看法。纯粹作为一种思考练习,我试图弄清楚如何做到这一点,并意识到我提出的任何解决方案都非常类似于您不满意的解决方案

您必须将表拆分为每列一个表,对这些列进行排序,然后通过按排序顺序联接来形成新列,这正是您要做的。我看不到这方面的捷径,因为正如前面所说的,关系数据库(更不用说关系数据库理论)的设计根本不支持“前辈”希望您执行的元组(行)操作

请记住,仅仅因为他们比你大,比你有“工作资历”,而且(显然)做这件事的时间比你长,(a)让他们做得对,或者(b)聪明。

(听起来这可能是由于导入了具有独立列的电子表格,但列排序不正确…?)

我同意这听起来像是一个奇怪的请求,因为它打破了同一行中值之间的联系。通常,同一行中的值具有由该行描述的实体定义的强逻辑连接。将它们分开并单独获取值通常会使信息变得毫无意义,或者表明数据一开始不需要存储在一个表中。如果是后者,那么将该表拆分为多个表将更有用

这是因为RDBMS模型基本上希望从同一行返回值,您必须像以前那样拆分表。从结构上讲,没有其他选择——只有不同的编写查询的方法才能获得相同的结果

我可以说,我认为你写了一个很好的问题——我面试过许多候选人,他们不可能像你一样解决这个问题。为了让您能够做好自己的工作,您的工作前辈至少应该向您解释为什么数据是这样的,以及如果改变表结构会给系统带来显著的改进,那么是否可以选择改变表结构。

(听起来这可能是由于导入了具有独立列的电子表格,但这些列没有正确排序…?)

我同意这听起来像是一个奇怪的请求,因为它打破了同一行中的值之间的联系。通常,同一行中的值具有由该行所描述的实体定义的强大逻辑联系。将它们分开并单独获取值通常会使信息变得毫无意义,或者表明数据不需要存储如果是后一种情况,那么将该表拆分为多个表将更有用

这是因为RDBMS模型基本上想要返回va