Oracle:插入到选择...中

时间:2014-09-26 13:04:38

标签: sql oracle

只需插入表中,插入选择表的优势是什么?

例如

insert into
( select COL1
       , COL2
  from   Table1
  where  1=2                  <= this and above is the focus of the question.
) select COL3, COL4 from Table2 ;

似乎做同样的事情:

insert into Table1
( COL1, COL2 )
select COL3, COL4 from Table2 ;

这是我第一次看到这个;我们的Sr Dev说有一些优势,但他不记得它是什么。

如果一个人从一个有很多列的表中插入“select * ...”,那么它可能是有道理的,我们想要变得懒惰,但是......我们不是。我们列举了表格中的每一列。

数据库是Oracle 11gR2,但此查询可能是在10g或之前编写的。

3 个答案:

答案 0 :(得分:0)

  

我们想要懒惰

不,我们在有大量记录时使用insert into table(col1, col2) select col2, col2 from ...(例如1M),我们不想为每个记录创建values部分。让我们想象一下,如果你写

需要多少时间
insert into table (col1, col2) 
values (select col1, col2 from (select col1, col2, rownum rn from ...) where rn = 1);
insert into table (col1, col2) 
values (select col1, col2 from (select col1, col2, rownum rn from ...) where rn = 2);
...
insert into table (col1, col2) 
values (select col1, col2 from (select col1, col2, rownum rn from ...) where rn = 1000000);

insert select是将数据从一个表(多个表)复制到另一个表的更快方法。

答案 1 :(得分:0)

简而言之。它变得容易多了。特别是当你有一个大规模的查询,你不想重建,或者你有一个对象的crapton,或你插入的值。

答案 2 :(得分:0)

如果没有指定WITH CHECK OPTION,我不知道这个语法有什么用途。如果指定WITH CHECK OPTION,则可以在insert语句中有效地实现ad-hoc检查约束。

insert into
( select COL1
       , COL2
  from   Table1
  where  1=2 WITH CHECK OPTION
) select COL3, COL4 from Table2 ;

上面永远不会插入记录,因为1永远不会等于2。 只要COL3小于100,下面的语句就会插入一条记录,否则会引发异常。

insert into
( select COL1
       , COL2
  from   Table1
  where  COL1 < 100 WITH CHECK OPTION
) select COL3, COL4 from Table2 ;