您好我有以下设置:
DATE HOUR COLUMN_A COLUMN_B COLUMN_C COLUMN_D
01.01.2017 1 VALUE_A VALUE_B VALUE_C VALUE_D
等等
我想拥有的是这样的东西
DATE HOUR KIND VALUE
01.01.2017 1 COLUMN_A Value_A
01.01.2017 1 COLUMN_B Value_B
01.01.2017 1 COLUMN_C Value_C
01.01.2017 1 COLUMN_D Value_D
现在我用UNION ALL
制作,它将开始扫描桌子4次。我没有看到这个问题的更有效方法吗?
答案 0 :(得分:0)
最新版本的Oracle支持横向连接 - 速度更快。在某些版本中,您可以使用unpivot
,但我发现语法过于专业(语法是神秘的,只对一件事有用)。
您应该使用cross join
和case
:
select t.date, t.hour, c.kind,
(case c.kind
when 'column_a' then colum_a
when 'column_b' then colum_b
when 'column_c' then colum_c
when 'column_d' then colum_d
end) as value
from t cross join
(select 'column_a' as kind from dual union all
select 'column_b' as kind from dual union all
select 'column_c' as kind from dual union all
select 'column_d' as kind from dual
) c;