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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Oracle 在一个查询中插入并选择默认值_Oracle - Fatal编程技术网

Oracle 在一个查询中插入并选择默认值

Oracle 在一个查询中插入并选择默认值,oracle,Oracle,我使用以下查询插入新行: insert into table1 (c1, c2, c3) (select c1, c2, c3 from table2 where some_condition) 如果表2中有一行满足某个条件,则该方法效果良好。但如果没有行,则不会插入任何内容 如果select返回空结果集,是否有方法指定要插入的默认值?我想在一个sql查询中实现这一点。这不是很漂亮,但它做了您想要的事情,您需要使用您的环境进行测试,看看它是否足够好 SQL> drop table so_

我使用以下查询插入新行:

insert into table1 (c1, c2, c3) (select c1, c2, c3 from table2 where some_condition)
如果表2中有一行满足某个条件,则该方法效果良好。但如果没有行,则不会插入任何内容


如果select返回空结果集,是否有方法指定要插入的默认值?我想在一个sql查询中实现这一点。

这不是很漂亮,但它做了您想要的事情,您需要使用您的环境进行测试,看看它是否足够好

SQL> drop table so_tgt;

Table dropped.

SQL> 
SQL> create table so_src (
  2   c1 varchar2(6)
  3  ,c2 varchar2(6)
  4  ,c3 varchar2(6)
  5  );

Table created.

SQL> 
SQL> insert into so_src values ( 'foo','bar','moo' );

1 row created.

SQL> 
SQL> create table so_tgt as select * from so_src where 1 = 0;

Table created.

SQL> 
SQL> /* Test for existing row insert */
SQL> insert into so_tgt
  2  with x as ( select s.*, 1 as r
  3          from so_src s
  4          where c1='foo'
  5          union
  6          select 'x','y','z',0 as r /* DEFAULT VALUES */
  7          from dual )
  8  select c1,c2,c3
  9  from x
 10  where r = ( select max(r) from x ) ;

1 row created.

SQL> 
SQL> select * from so_tgt;

C1     C2     C3
------ ------ ------
foo    bar    moo

SQL> truncate table so_tgt;

Table truncated.

SQL> 
SQL> /* Test for default row insert */
SQL> insert into so_tgt
  2  with x as ( select s.*, 1 as r
  3          from so_src s
  4          where c1='far'
  5          union
  6          select 'x','y','z',0 as r /* DEFAULT VALUES */
  7          from dual )
  8  select c1,c2,c3
  9  from x
 10  where r = ( select max(r) from x ) ;

1 row created.

SQL> 
SQL> select * from so_tgt;

C1     C2     C3
------ ------ ------
x      y      z

SQL> truncate table so_tgt ;

Table truncated.

如果您不介意重复
some_条件
,并且
some_条件
不依赖于表2中的值,那么快速而肮脏的方法是:

insert into table1 (c1,c2,c3)
select c1, c2, c3 from table2 where some_condition
union select defaultvalue1, defaultvalue2, defaultvalue3 from dual where not (some_condition)
如果某个条件取决于表2中的值,则可以执行(未测试):

如果我是对的,这个查询将始终返回至少一行,但是如果右侧没有显示行,那么t2值将全部返回为null,因此可以使用
nvl
来提供默认值

编辑:小警告。这假设从表2中返回的值不为null,或者如果为null,则需要默认值

   insert into table1 (c1,c2,c3)
   select nvl(t2.c1, defaultvalue1), nvl(t2.c2, defaultvalue2), nvl(t2.c2, defaultvalue3)
   from dual left join (select c1,c2,c3 from table2 where some_condition) t2
   on 1 = 1