2010-05-24 60 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模型從根本上想從你必須掰開表爲你做同一行返回值。在結構上,沒有其他選擇 - 只有不同的方式來編寫查詢才能獲得相同的結果。

我可以說,我想你已經寫了一個很好的查詢 - 我採訪了許多候選人你誰也無法解決了這個問題。對於你能夠做你的工作,你的工作,老年人應至少向你解釋爲什麼數據是這樣的,以及是否更改表結構是一個選項,如果這將帶來顯著改善系統。