【问题标题】:Create a new view from existing table by duplicating the rows and changing the table structure通过复制行和更改表结构从现有表创建新视图
【发布时间】:2018-04-04 11:36:05
【问题描述】:

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

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

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

我生成的视图应该是这样的,

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

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    使用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; 
    

    【讨论】:

      【解决方案2】:

      您也可以使用 unpivot 功能:

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

      【讨论】:

      • 这工作正常且过于紧凑的解决方案。但我无法预测它是如何发生的。
      • @Nwn,你无法预测什么? unpivot 的行为是确定性的。或者你的意思是你不明白它是如何工作的?
      • 是的。就是这样。我不知道它是如何工作的。
      • 谢谢我会通过它
      【解决方案3】:

      一个简单的UNION (ALL) 就可以做到这一点:

      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>
      

      【讨论】:

        猜你喜欢
        • 2011-02-21
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 1970-01-01
        相关资源
        最近更新 更多