Oracle SQL:创建视图,其中不同的列名称将是一个新的值列

时间:2017-11-11 15:32:10

标签: sql oracle view

您好我有以下设置:

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次。我没有看到这个问题的更有效方法吗?

1 个答案:

答案 0 :(得分:0)

最新版本的Oracle支持横向连接 - 速度更快。在某些版本中,您可以使用unpivot,但我发现语法过于专业(语法是神秘的,只对一件事有用)。

您应该使用cross joincase

获得类似的效果
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;