通过复制行并更改表结构

时间:2018-04-04 11:36:05

标签: sql oracle

我有一个名为“table1”的表,其中包含以下行。

ID  category1  category2
------------------------- 
1     value1    value2
2     value3    value4

然后我想从“table1”上面创建一个视图。在我看来只有三列。我引入了名为“category”的新列,它可以存储类别的类型。然后,“category1”和“category2”列名都属于该“category”列,并引入了另一个名为value的新列来存储每个类别的值。允许ID列重复。

我生成的视图应该是,

ID    category     value
--------------------------
1     category1    value1
1     category2    value2
2     category1    value3
2     category2    value4

我正在使用Oracle。反正有没有做过这样的事情?是可能还是不可能?

3 个答案:

答案 0 :(得分:3)

使用Union [All]就足够了:

create or replace view v_table1 as
select * from
(
  select t1.id, 'category1' category,t1.category1 value from table1 t1
  union all 
  select t2.id, 'category2' category, t2.category2 from table1 t2
)
order by id, value; 

答案 1 :(得分:1)

一个简单的UNIONALL)可以做到这一点:

SQL> WITH test (id, category1, category2)
  2       AS (SELECT 1, 'value1', 'value2' FROM DUAL
  3           UNION
  4           SELECT 2, 'value3', 'value4' FROM DUAL)
  5  SELECT id, 'category1' category, category1 VALUE FROM test
  6  UNION ALL
  7  SELECT id, 'categor12', category2 FROM test
  8  ORDER BY 1, 2;

        ID CATEGORY  VALUE
---------- --------- ------
         1 category1 value1
         1 categor12 value2
         2 category1 value3
         2 categor12 value4

SQL>

答案 2 :(得分:1)

您也可以使用unpivot功能:

select * 
  from table1 unpivot(
        value for category in(category1, category2)
  );