如何将每行中包含多个键和值的表“展开”到每行中有一个键和值的表中?
例如我有一张表
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对。
答案 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