2017-08-07 37 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 

这应该给予同样的结果,不是吗?