2017-08-07 76 views
0

我在Vertica數據庫中有一個N x M表,我的目標是創建一個具有N*M x M的新表,使得初始表中的每一行都被M行替換,其中起始項是permuated。SQL:通過排列起始項來擴展現有表

這裏是一個2 x 3

+-------+-------+-------+ 
| Item1 | Item2 | Item3 | 
+-------+-------+-------+ 
| A  | B  | C  | 
| C  | K  | L  | 
+-------+-------+-------+ 

成爲一個6 x 3表,其中來自原始行的每一行得到了由3個新行,其中項目1始終是一個不同的啓動項替代的例子。

+-------+-------+-------+ 
| Item1 | Item2 | Item3 | 
+-------+-------+-------+ 
| A  | B  | C  | 
| B  | A  | C  | 
| C  | A  | B  | 
| C  | K  | L  | 
| K  | C  | L  | 
| L  | C  | K  | 
+-------+-------+-------+ 

是否有一個優雅的解決諸如此類的問題,我試着用各種方式加盟,但至今沒有運氣。謝謝!!

+0

沒有優雅的飲料。 –

+0

我很害怕這個答案。 – valenzio

回答

1

我在一般情況下幫不了你。在特定的情況下,這項工作在Vertica上會如何?

select 
    case n 
     when 1 then item1 
     when 2 then item2 
     else item3 
    end as item1, 
    case n 
     when 1 then item2 
     when 2 then item3 
     else item1 
    end as item2, 
    case n 
     when 1 then item3 
     when 2 then item1 
     else item2 
    end as item3 
from tab 
cross join (select 1 as n union all select 2 as n union all select 3 as n) as b 

我是一個SQL Server的人自己,這將是直截了當地從表(上表元數據給出合理的約束)的定義,使此查詢動態,但很可惜,我不知道Vertica的

+0

這適用於Vertica,我使用python生成我的querries,所以我會試着想出適用於一般情況的例程。感謝您的意見。 – valenzio

0

我就在想,爲什麼不直接使用一堆工會一樣,

SELECT Item1, Item2, Item3 from Table 
union SELECT Item2, Item3, Item1 from Table 
UNION SELECT Item3, Item1, Item2 from Table 

這應該給予同樣的結果,不是嗎?