Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 условие в операторе MERGE  [new]
Ora_Junior_2006
Guest
merge into dummy_strings s
using dummy_numbers n
on (1 = 1)
when matched then update set s.str1 = n.num2
when not matched then insert values (n.num1, n.num2);


почему оракл вставляет записи, а не обновляет их. 1 же равно 1. по логике надо обновлять или как?
12 сен 06, 17:35    [3125894]     Ответить | Цитировать Сообщить модератору
 Re: условие в операторе MERGE  [new]
Newb_ora
Member

Откуда: Прекрасное далеко
Сообщений: 71
Может в том причина, что в условии ON 1=1 верно, но в условии нет связки между таблицами так .... вроде s.str2=n.num2
попробуй переписать так
 merge into dummy_strings s
using (select num1, num2 from dummy_numbers) n
on (s.str2=n.num2)
when matched then update set s.str1 = n.num2
when not matched then insert values (n.num1, n.num2); 
12 сен 06, 18:20    [3126166]     Ответить | Цитировать Сообщить модератору
 Re: условие в операторе MERGE  [new]
Ora_Junior_2006
Guest
Причем, если таблица DUMMY_STRINGS непустая, то ошибка

ORA-30926: невозможно получить устойчивый набор строк в исходных таблицах

если пустая то,
вставляет записи, хотя должен обновлять, т.е. ничего не делать.

конечно условие ON (1=1) бессмысленно, но тем не менее, так работает.
12 сен 06, 18:22    [3126181]     Ответить | Цитировать Сообщить модератору
 Re: условие в операторе MERGE  [new]
NuEarth
Member

Откуда:
Сообщений: 1
Ora_Junior_2006
merge into dummy_strings s
using dummy_numbers n
on (1 = 1)
when matched then update set s.str1 = n.num2
when not matched then insert values (n.num1, n.num2);


почему оракл вставляет записи, а не обновляет их. 1 же равно 1. по логике надо обновлять или как?


Вместо условия (1=1) должно быть условие соответствия для строк таблиц dummy_strings и dummy_numbers, которое, собственно и проверяется.Например:
merge into dummy_strings s
using dummy_numbers n
on (s.strX=n.numY)
when matched then update set s.str1 = n.num2
when not matched then insert values (n.num1, n.num2);
12 сен 06, 18:42    [3126311]     Ответить | Цитировать Сообщить модератору
 Re: условие в операторе MERGE  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
NuEarth
Вместо условия (1=1) должно быть условие соответствия для строк таблиц dummy_strings и dummy_numbers, которое, собственно и проверяется.Например:
merge into dummy_strings s
using dummy_numbers n
on (s.strX=n.numY)
when matched then update set s.str1 = n.num2
when not matched then insert values (n.num1, n.num2);


Not exactly. ON(1 = 1) could be working and ON(s.strX=n.numY) could be not. What MERGE must ensure is for each row in dummy_strings table ON codition(s) produce no more than one row in table dummy_numbers. So if table dummy_numbers would have a single row, ON(1 = 1) would work (I am not questioning the logic). For example:

SQL> create table emp1 as select empno,ename from emp;

Table created.

SQL> create table emp2 as select empno,ename||'X' ename from emp;

Table created.

SQL> merge into emp1
  2  using emp2
  3  on (1= 1)
  4  when matched then update set emp1.ename = emp2.ename
  5  when not matched then insert values(emp2.empno,emp2.ename);
using emp2
      *
ERROR at line 2:
ORA-30926: unable to get a stable set of rows in the source tables

SQL> delete emp2 where ename <> 'KINGX';

13 rows deleted.

SQL> merge into emp1
  2  using emp2
  3  on (1= 1)
  4  when matched then update set emp1.ename = emp2.ename
  5  when not matched then insert values(emp2.empno,emp2.ename);

14 rows merged.

SQL> select distinct ename from emp1;

ENAME
----------
KINGX

SQL> rollback;

Rollback complete.

SQL> insert into emp2 select * from emp2;

14 rows created.

SQL> merge into emp1
  2  using emp2
  3  on (emp1.empno = emp2.empno)
  4  when matched then update set emp1.ename = emp2.ename
  5  when not matched then insert values(emp2.empno,emp2.ename);
using emp2
      *
ERROR at line 2:
ORA-30926: unable to get a stable set of rows in the source tables
 

SY.
12 сен 06, 19:39    [3126552]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить