вставить и выбрать в одном запросе значения по умолчанию - PullRequest
1 голос
/ 02 ноября 2011

Я использую следующий запрос для вставки новой строки:

insert into table1 (c1, c2, c3) (select c1, c2, c3 from table2 where some_condition)

Это прекрасно работает, если в таблице 2 есть строка, удовлетворяющая some_condition. Но если строк нет, ничего не вставляется.

Есть ли способ указать значения по умолчанию для вставки, если select возвращает пустой набор результатов? Я хочу сделать это одним SQL-запросом.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Быстрый и грязный способ, если вы не возражаете повторить some_condition и где some_condition не зависит от значений в таблице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)

Если some_condition зависит от значений в таблице2, то вы можете сделать (не проверено):

   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

Если я прав, этот запрос всегда будет возвращать хотя бы одну строку, но если с правой стороны не будет отображено ни одной строки, то все значения t2 будут возвращены как нулевые, и поэтому nvl можно использовать для укажите ваши значения по умолчанию.

Редактировать : Небольшая оговорка. Это предполагает, что значения, возвращаемые из таблицы2, не будут нулевыми или что если они будут, вам нужны значения по умолчанию.

1 голос
/ 02 ноября 2011

Это не очень красиво, но оно делает то, что вы хотите, вам нужно протестировать с вашей средой, чтобы убедиться, что она работает достаточно хорошо

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...