Oracle从表中插入查询

dan*_*ang 1 sql oracle

我有一个看起来像这样的表:

表格1

column1 column2 column3
1       2       3 
a       6       9 
b       8       7 
Run Code Online (Sandbox Code Playgroud)

我需要以这种格式将此数据复制到另一个表:

表2

column_name value
column1     1
column1     a
column1     b
column2     2
column2     6
column2     8
column3     3
column3     9
column3     7
Run Code Online (Sandbox Code Playgroud)

有超过100个表,如table1,有数百万行.我需要在table2中复制它.

所以,我打算写一下:

INSERT INTO table2
(column_name, value)
SELECT 'column1', column1
FROM table1;

INSERT INTO table2
(column_name, value)
SELECT 'column2', column2
FROM table1;

INSERT INTO table2
(column_name, value)
SELECT 'column3', column3
FROM table1;
Run Code Online (Sandbox Code Playgroud)

我有80个这样的列.是否有一种有效的编写方式,在Oracle中复制数据时也能快速工作?

编辑:更改了示例数据集以包含不同类型的数据.如果我使用unpivot,它会给我:

ORA-01790:表达式必须与相应的表达式具有相同的数据类型

Tha*_*ddy 5

使用unpivot

 select * from table1
    unpivot
    (
    "values" for column_names in (column1,column2,column3))
Run Code Online (Sandbox Code Playgroud)

编辑:插入上面的语句以将数据填充到另一个中

create table table2
(
column_names varchar2(1),
"values" varchar2(1)
)
/
    insert into table2
    select * from table1
        unpivot
        (
        "values" for column_names in (column1 as '1',column2 as '2',column3 as '3'))
Run Code Online (Sandbox Code Playgroud)

更新它将用1替换column1,用2等替换column2

 select * from table1
        unpivot
        (
        "values" for column_names in (column1 as '1',column2 as '2',column3 as '3'))
Run Code Online (Sandbox Code Playgroud)