2010-05-11 21 views
1

!!!警告 !!!Sort-n-Concatenate 5列的最佳方式

最親愛的SQL專家,請繼續閱讀之前開始尖叫。 這個超級非規範化表結構是 後應用一些 combinatories-糖在一個很好的規範化的 數據集:)。我回避 重新正規化這個結果集,因爲我想要保持簡單的完整 進程(也不會在應用程序的另一個地方使用這個數據) 。 (是的,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 

什麼是做到這一點的最好辦法?顯然

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 

,數據庫從未設計跨列進行排序這就是爲什麼解決方案是麻煩:

+5

我不明白。 SQL中的排序按行進行。你真的想要*排列列*嗎?因爲這是一個嚴重的設計缺陷的跡象。 – Aaronaught 2010-05-11 20:43:50

+0

你可以在荒謬的CASE陳述集中寫出5列排序......但我同意@Aaronaught。 – derobert 2010-05-11 20:48:13

+0

@AaronNaught這個表格結構是在一組標準化的數據上應用一些組合數據後獲得的:)。我避免重新規範這個結果集,因爲我想保持簡單的過程(這些數據也不會在應用程序的另一個地方使用:) – SDReyes 2010-05-11 20:54:15

回答

3

看過去的,你爲什麼會需要做這個嚴重的問題,可以儘管笨拙實現實現。

+0

嗨托馬斯!是的,我同意。這是非正常的。但它只是保持組合過程簡單(不會在家裏嘗試):) +1 – SDReyes 2010-05-11 20:56:48