Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 merge when matched then delete?  [new]
vyv3
Member

Откуда: Нск
Сообщений: 305
Можно сделать?
10 ноя 06, 13:02    [3382126]     Ответить | Цитировать Сообщить модератору
 Re: merge when matched then delete?  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
Можно в 10g.
10 ноя 06, 13:03    [3382151]     Ответить | Цитировать Сообщить модератору
 Re: merge when matched then delete?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
10g
MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
     VALUES (S.employee_id, S.salary*0.1)
     WHERE (S.salary <= 8000);
10 ноя 06, 13:06    [3382186]     Ответить | Цитировать Сообщить модератору
 Re: merge when matched then delete?  [new]
vyv3
Member

Откуда: Нск
Сообщений: 305
Q u a d r o
Можно в 10g.

Как раз 10G
Но when matched then update set ... delete
не подходит, т.к. не дает апдейтит поля которые в on ()
Есть таблицы
t (number id)
t1 (number id)

Нужно вставить в t1 значения из t, которых нет в t1, которые были удалить.
одним оператором.
10 ноя 06, 13:09    [3382209]     Ответить | Цитировать Сообщить модератору
 Re: merge when matched then delete?  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
vyv3
не подходит, т.к. не дает апдейтит поля которые в on ()


Сделайте dummy-колонку, которую и будете апдейтить... Что-то в этом духе:

SQL> create table t (n number);

Table created.

SQL> create table t1 (n number, dummy number);

Table created.

SQL> insert all
  2   when (n<=5) then into t1 values (n, null)
  3   when (n<=10) then into t
  4   select level n from dual connect by level <= 10;

15 rows created.

SQL> commit;

Commit complete.

SQL> select * from t;

         N
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

SQL> select * from t1;

         N      DUMMY
---------- ----------
         1
         2
         3
         4
         5

SQL> merge into t1 
  2   using (select * from t) t
  3   on (t1.n=t.n)
  4   when matched then update set t1.dummy=null delete where 1=1
  5   when not matched then insert values (t.n, null);

10 rows merged.

SQL> select * from t1;

         N      DUMMY
---------- ----------
         8
        10
         6
         7
         9
10 ноя 06, 13:21    [3382328]     Ответить | Цитировать Сообщить модератору
 Re: merge when matched then delete?  [new]
vyv3
Member

Откуда: Нск
Сообщений: 305
Q u a d r o
vyv3
не подходит, т.к. не дает апдейтит поля которые в on ()


Сделайте dummy-колонку, которую и будете апдейтить... Что-то в этом духе:

SQL> create table t (n number);

Table created.

SQL> create table t1 (n number, dummy number);

Table created.

SQL> insert all
  2   when (n<=5) then into t1 values (n, null)
  3   when (n<=10) then into t
  4   select level n from dual connect by level <= 10;

15 rows created.

SQL> commit;

Commit complete.

SQL> select * from t;

         N
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

SQL> select * from t1;

         N      DUMMY
---------- ----------
         1
         2
         3
         4
         5

SQL> merge into t1 
  2   using (select * from t) t
  3   on (t1.n=t.n)
  4   when matched then update set t1.dummy=null delete where 1=1
  5   when not matched then insert values (t.n, null);

10 rows merged.

SQL> select * from t1;

         N      DUMMY
---------- ----------
         8
        10
         6
         7
         9

Сейчас так и работает, но этот лишний столбец, мозолит глаза
10 ноя 06, 13:23    [3382345]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить