使用子查询作为目标插入

时间:2013-09-19 15:15:26

标签: sql oracle

INSERT INTO (SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234) 
   VALUES(SEQ.NEXTVAL,2456,'qwew','12312','12312');

对于上述查询,我​​想,我只能将行table插入col1,其中1234的值为1234。但是,我能够为col1插入{{1}}以外的值。

问题:

为什么我们需要像上面这样的查询?使用它的现实生活场景是什么?

2 个答案:

答案 0 :(得分:1)

它基本上是一个允许可更新视图的构造。对于多表方案,INSERT只能是其中一个基础表。 View和要插入的表之间必须存在One-One关系。

您展示的查询是一个内联视图,扩展了相同的概念。

请阅读此处以获取更多文档

http://docs.oracle.com/cd/E17952_01/refman-5.1-en/view-updatability.html

现实生活 - 能够通过View实现这一目标,提供灵活性和轻松性。但欢迎更多有价值的投入。

答案 1 :(得分:1)

我不知道你能做到这一点,说实话,但我想这是你可以插入视图的事实的副产品,而(SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234)是一个内联视图。

正如您所暗示的那样,在INSERT的情况下没有多大意义,但它对UPDATE或DELETE很有用,通常涉及到连接:

update (select id, col1 from table1
        join   table2 on table2.col2 = table1.col2
        where  table2.col3 = 'X'
       )
set    col1 = 'Y';

只有在Oracle认为该列可以更新时才会有效,这要求在此示例中有一个从table1到table2的外键。

使用“真实”视图,您可以对插入内容进行限制:

create view myview as SELECT id,col1,col2,col3,col4 FROM table WHERE col1=1234
WITH CHECK OPTION;

WITH CHECK OPTION子句意味着新行不得违反视图的WHERE子句:

SQL> insert into myview (id, col1) values (SEQ.NEXTVAL, 9876);
                 *
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation

我不认为有一种方法可以使用内联视图。