Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle从表插入查询_Sql_Oracle - Fatal编程技术网

Sql Oracle从表插入查询

Sql Oracle从表插入查询,sql,oracle,Sql,Oracle,我有一张这样的桌子: 表1 column1 column2 column3 1 2 3 a 6 9 b 8 7 我需要以以下格式将此数据复制到另一个表: 表2 column_name value column1 1 column1 a column1 b column2 2 column2 6 column2 8 column3 3 column3 9

我有一张这样的桌子:

表1

column1 column2 column3
1       2       3 
a       6       9 
b       8       7 
我需要以以下格式将此数据复制到另一个表:

表2

column_name value
column1     1
column1     a
column1     b
column2     2
column2     6
column2     8
column3     3
column3     9
column3     7
有100多个表,如table1,有数百万行。我需要把这个复制到表2中

所以,我打算这样写:

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;
我有80个这样的专栏。有没有一种有效的方法可以快速地在Oracle中复制数据

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


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

 select * from table1
    unpivot
    (
    "values" for column_names in (column1,column2,column3))
编辑:插入上述语句以将数据填充到另一个

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'))
更新它将用1替换第1列,用2替换第2列,以此类推

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

用unpivot来做那件事

 select * from table1
    unpivot
    (
    "values" for column_names in (column1,column2,column3))
编辑:插入上述语句以将数据填充到另一个

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'))
更新它将用1替换第1列,用2替换第2列,以此类推

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

这里有两种取消激活数据的方法-一种是手动方式,另一种是使用UNPIVOT关键字。您必须对这两种方法进行测试,以确定哪一种最适合您的数据集

with sample_data as (select '1' column1, 2 column2, 3 column3 from dual union all
                     select 'a' column1, 6 column2, 9 column3 from dual union all
                     select 'b' column1, 8 column2, 7 column3 from dual)
select d.id column_id,
       case when d.id = 1 then sd.column1
            when d.id = 2 then to_char(sd.column2)
            when d.id = 3 then to_char(sd.column3)
       end value
from   sample_data sd
       cross join (select level id
                   from   dual
                   connect by level <= 3) d;

COLUMN_NAME VALUE                                   
----------- ----------------------------------------
          1 1                                       
          1 a                                       
          1 b                                       
          2 2                                       
          2 6                                       
          2 8                                       
          3 3                                       
          3 9                                       
          3 7   

with sample_data as (select '1' column1, 2 column2, 3 column3 from dual union all
                     select 'a' column1, 6 column2, 9 column3 from dual union all
                     select 'b' column1, 8 column2, 7 column3 from dual)
select *
from   (select column1,
               to_char(column2) column2,
               to_char(column3) column3
        from   sample_data) sd
unpivot (value for column_id in (column1 as '1', column2 as '2', column3 as '3')) d;

COLUMN_ID VALUE                                   
--------- ----------------------------------------
1         1                                       
2         2                                       
3         3                                       
1         a                                       
2         6                                       
3         9                                       
1         b                                       
2         8                                       
3         7        

这里有两种取消激活数据的方法-一种是手动方式,另一种是使用UNPIVOT关键字。您必须对这两种方法进行测试,以确定哪一种最适合您的数据集

with sample_data as (select '1' column1, 2 column2, 3 column3 from dual union all
                     select 'a' column1, 6 column2, 9 column3 from dual union all
                     select 'b' column1, 8 column2, 7 column3 from dual)
select d.id column_id,
       case when d.id = 1 then sd.column1
            when d.id = 2 then to_char(sd.column2)
            when d.id = 3 then to_char(sd.column3)
       end value
from   sample_data sd
       cross join (select level id
                   from   dual
                   connect by level <= 3) d;

COLUMN_NAME VALUE                                   
----------- ----------------------------------------
          1 1                                       
          1 a                                       
          1 b                                       
          2 2                                       
          2 6                                       
          2 8                                       
          3 3                                       
          3 9                                       
          3 7   

with sample_data as (select '1' column1, 2 column2, 3 column3 from dual union all
                     select 'a' column1, 6 column2, 9 column3 from dual union all
                     select 'b' column1, 8 column2, 7 column3 from dual)
select *
from   (select column1,
               to_char(column2) column2,
               to_char(column3) column3
        from   sample_data) sd
unpivot (value for column_id in (column1 as '1', column2 as '2', column3 as '3')) d;

COLUMN_ID VALUE                                   
--------- ----------------------------------------
1         1                                       
2         2                                       
3         3                                       
1         a                                       
2         6                                       
3         9                                       
1         b                                       
2         8                                       
3         7        


我不知道为什么会有这样的要求。但是如果必须这样做,只需像上面那样生成80条insert语句,并一次性运行它们。有时你不得不变得残忍,给硬件添麻烦。@VarunRao-有键值结构不好吗?没有办法优化它吗?编写一个Java应用程序或PL/SQL脚本程序来处理它。@dang键值结构在设计良好的RDBMS中通常是不受欢迎的。首先,很难质疑。我不知道为什么会有这样的要求。但是如果必须这样做,只需像上面那样生成80条insert语句,并一次性运行它们。有时你不得不变得残忍,给硬件添麻烦。@VarunRao-有键值结构不好吗?没有办法优化它吗?编写一个Java应用程序或PL/SQL脚本程序来处理它。@dang键值结构在设计良好的RDBMS中通常是不受欢迎的。首先,查询要困难得多。答案中有语法问题。我已经更新了查询,现在检查一下。如果您仍然收到错误,请将其发布。我忘记关闭括号,现在我已编辑请检查。我必须使用ID代替列名,因此column1将替换为1,column2将替换为2。如何使用unpivot进行操作?另外,请注意数据的数据类型不同,因此给出错误-ORA-01790:表达式必须与相应的表达式具有相同的数据类型答案中存在语法问题。我已经更新了查询,请立即检查。如果您仍然收到错误,请将其发布。我忘记关闭括号,现在我已编辑请检查。我必须使用ID代替列名,因此column1将替换为1,column2将替换为2。如何使用unpivot进行操作?另外,请注意数据的数据类型不同,因此给出错误-ORA-01790:表达式必须与相应的表达式具有相同的数据类型