使用sql在每行中展开包含多个键和值的表

时间:2014-01-10 13:34:10

标签: sql oracle

如何将每行中包含多个键和值的表“展开”到每行中有一个键和值的表中?

例如我有一张表

key1 value1 key2 value2  
a    1      b    2  
c    3      d    4  
e    5      f    6 

我希望将其更改为

key value  
a   1  
b   2  
c   3  
d   4  
e   5  
f   6  

上面每行只有两个键和值,但我需要一般情况下的解决方案,每行最多可以有7对。

2 个答案:

答案 0 :(得分:3)

最有效的方法是使用交叉连接:

select (case when n.n = 1 then key1 else key2 end) as "key",
       (case when n.n = 1 then value1 else value2 end) as "value"
from table t cross join
     (select 1 as n from dual union all select 2 from dual 
     ) n;

这比union all方法更有效的原因是因为表只扫描一次。在许多情况下,这种性能提升并不重要(一次扫描而不是两次),但在某些情况下它可能很重要。

答案 1 :(得分:1)

只使用union / union all?

假设key1和key2的类型相同,则为value1和value2

select key1, value1
from table
union all -- or just union to merge duplicates
select key2, value2
from table