只需插入表中,插入选择表的优势是什么?
例如
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或之前编写的。
答案 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 ;