powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация набора данных; merge+delete в одном операторе возможно?
25 сообщений из 56, страница 1 из 3
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663468
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две таблицы, связанные 1:M.
Примерно так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE TABLE ITEMS
(
  ITEM_ID          NUMBER         NOT NULL,
  NAME             VARCHAR2       NOT NULL,
  ...
);

INSERT INTO ITEMS (ITEM_ID,NAME) VALUES (1,'item1');
INSERT INTO ITEMS (ITEM_ID,NAME) VALUES (2,'item2');
INSERT INTO ITEMS (ITEM_ID,NAME) VALUES (3,'item3');

CREATE TABLE DETAILS
(
  DETAIL_ID        NUMBER         NOT NULL,
  ITEM_ID          NUMBER         NOT NULL,
  TYPE_ID          NUMBER         NOT NULL,
  REF_ID           NUMBER         NOT NULL,
  DATE_BEG         DATE           NOT NULL,
  DATE_END         DATE,
  DESCRIPTION      VARCHAR2       NOT NULL,
  ...
);

INSERT INTO DETAILS (ITEM_ID,TYPE_ID,REF_ID,DATE_BEG,DATE_END,DESCRIPTION) VALUES (1,1,2,'01.01.2001',null,'detail-1-2');
INSERT INTO DETAILS (ITEM_ID,TYPE_ID,REF_ID,DATE_BEG,DATE_END,DESCRIPTION) VALUES (1,1,3,'01.01.2001',null,'detail-1-3');
INSERT INTO DETAILS (ITEM_ID,TYPE_ID,REF_ID,DATE_BEG,DATE_END,DESCRIPTION) VALUES (2,1,1,'01.01.2001',null,'detail-2-1');
INSERT INTO DETAILS (ITEM_ID,TYPE_ID,REF_ID,DATE_BEG,DATE_END,DESCRIPTION) VALUES (3,1,1,'01.01.2001',null,'detail-3-1');
INSERT INTO DETAILS (ITEM_ID,TYPE_ID,REF_ID,DATE_BEG,DATE_END,DESCRIPTION) VALUES (3,1,2,'01.01.2001',null,'detail-3-2');



Есть запрос, возвращающий нужный мне набор значений для подчиненной таблицы:
ItemRefValue12'value1'21'value2'23'value3'

Можно ли одним оператором в связанную (подчиненную) таблицу добавить несуществующие записи, обновить существующие и удалить уже неиспользуемые записи?
Т.е. мне в данном случае нужно обновить две записи (item/ref 1/2 и 2/1), добавить одну запись (item/ref 2/3) и удалить три записи (item/ref 1/1, 3/1, 3/2).

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663490
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

в чем проблема? начиная с 10g в merge имеется delete кляуза
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663519
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B. ,
при этом главное не наступить на это как я пару дней назад)
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663588
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orawishв чем проблема? начиная с 10g в merge имеется delete кляуза
А пример использования не покажите?
Я в гугле не нашел примера сразу с тремя операциями.
И без примера не пойму, как в одном блоке WHEN MATCHED указать сразу и delete и update.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663604
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходя из этого , должен быть такой запрос:

merge into ...
when matched update ...
when not matched insert ...
delete where ...

?
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663618
брадобрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.orawishв чем проблема? начиная с 10g в merge имеется delete кляуза
А пример использования не покажите?
Я в гугле не нашел примера сразу с тремя операциями.
И без примера не пойму, как в одном блоке WHEN MATCHED указать сразу и delete и update.

для беспомощного овоща всегда пожалуйста
тыкай

кто тебя заставляет заниматься таким сложным для тебя занятием?
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663629
брадобрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
брадобрейAlibek B.пропущено...

А пример использования не покажите?
Я в гугле не нашел примера сразу с тремя операциями.
И без примера не пойму, как в одном блоке WHEN MATCHED указать сразу и delete и update.

для беспомощного овоща всегда пожалуйста
тыкай

кто тебя заставляет заниматься таким сложным для тебя занятием?
Прости друг, похоже это я дурак. Там нет примера как одновременно юзать и update и delete.
Посыпаю голову пеплом.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663648
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
брадобрей,
у тебя по первой ссылке из твоего поиска нет в примерах строчки
Код: plsql
1.
2.
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)

?
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663654
брадобрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vintбрадобрей,
у тебя по первой ссылке из твоего поиска нет в примерах строчки
Код: plsql
1.
2.
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)

?
Так выходит это не я дурак, а автор? Ты спас меня от стеноубийства.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37663814
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
брадобрейТы спас меня от стеноубийства.рано отходить от стены, поскольку утверждение "одновременно юзать и update и delete" провоцирует на мысль о возможности delete без update.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37664492
ivan78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.Можно ли одним оператором в связанную (подчиненную) таблицу добавить несуществующие записи, обновить существующие и удалить уже неиспользуемые записи?
Нет.
В MSSQL оператор merge позволяет это делать, а в Oracle только через отдельные delete после merge.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37664528
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivan78В MSSQL оператор ...Ух ты! Не знал, что MS кроме мсдозы еще и мсбасы выпускает.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37665825
ivan78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-Ух ты! Не знал, что MS кроме мсдозы еще и мсбасы выпускает.
Учиться никогда не поздно. :)
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666077
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivan78В MSSQL оператор merge позволяет это делать, а в Oracle только через отдельные delete после merge.

В Oracle DELETE в MERGE возможен но только как часть UPDATE - выполняется после UPDATE. Поэтому условие в кляузе DELETE проверяется применительно к уже измененным значениям полей. При этом необходимо помнить об UPDATE триггерах и вообще там были непонятки с какие и в каком порядкe тригера выполняются - где-то на форуме уже было, лень искать.

SY.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666100
ivan78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SYВ Oracle DELETE в MERGE возможен но только как часть UPDATE - выполняется после UPDATE. Поэтому условие в кляузе DELETE проверяется применительно к уже измененным значениям полей. При этом необходимо помнить об UPDATE триггерах и вообще там были непонятки с какие и в каком порядкe тригера выполняются - где-то на форуме уже было, лень искать.

SY.
Да, я это понимаю.
Но автор-то просит немного другого. Ему нужен способ определить записи отсутствующие в исходном множестве, но присутствующие в конечном. Тот самый WHEN NOT MATCHED BY SOURCE из MSSQL-я.
А в Оракле его нет. Неудивительно что никто не смог привести работающий пример, но стали вместо этого обзываться.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666125
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivan78А в Оракле его нет. Неудивительно что никто не смог привести работающий пример, но стали вместо этого обзываться.

Да, в Оракле его нет. Приходится изголяться:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
create table target as select ename,sal - 1000 sal from emp where deptno in (10,20)
/
create table source as select ename,sal from emp where deptno in (10,30)
/
SQL> select * from source
  2  /

ENAME             SAL
---------- ----------
CLARK            2450
KING             5000
MILLER           1300
ALLEN            1600
WARD             1250
MARTIN           1250
BLAKE            2850
TURNER           1500

ENAME             SAL
---------- ----------
JAMES             950

9 rows selected.

SQL> select * from target
  2  /

ENAME             SAL
---------- ----------
CLARK            1450
KING             4000
MILLER            300
SMITH            -200
JONES            1975
SCOTT            2000
ADAMS             100
FORD             2000

8 rows selected.

merge
  into target t
  using (
          select  ename,
                  sal,
                  1 indicator
            from  source
         union all
          select  ename,
                  sal,
                  2 indicator
            from  target
            where ename not in (
                                select  ename
                                  from  source
                               )
        ) s
  on (
      t.ename = s.ename
     )
  when not matched
    then
      insert
        values(
               s.ename,
               s.sal
              )
  when matched
    then
      update
         set t.sal = s.sal
      delete where s.indicator = 2
/


14 rows merged.

SQL> select * from target
  2  /

ENAME             SAL
---------- ----------
CLARK            2450
KING             5000
MILLER           1300
BLAKE            2850
MARTIN           1250
ALLEN            1600
WARD             1250
JAMES             950

ENAME             SAL
---------- ----------
TURNER           1500

9 rows selected.

SQL>   



SY.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666135
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivan78,

Еще по теме SCD2 .

SY.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666252
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYДа, в Оракле его нет.это полуправда
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create table testm as select level n, 'this is '||level s from dual connect by level<=5;

select * from testm;

N S                                              
- ------------------------------------------------
1 this is 1                                        
2 this is 2                                        
3 this is 3                                        
4 this is 4                                        
5 this is 5                                        

merge into testm tgt
using (select 1 n, 'one' s from dual union all select 4, 'four' from dual) src
on (tgt.n=src.n(+))
when matched then update set s = src.s
delete where src.n is null
;

5 rows merged.

select * from testm;

N S                                              
- ------------------------------------------------
1 one                                              
4 four                                             
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666306
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-это полуправда

В Оракле его нет - правда
В Оракле его можно имитировать - полуправда. В тех случаях когда есть тригеры на UPDATE могут быть проблемы. И в любом случае это UPDATE+DELETE что есть падение производительности.

SY.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666569
ivan78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем, мне было полезно.
Самому недавно с такой задачей пришлось столкнуться, но не додумался что это можно сделать так просто.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666650
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-on (tgt.n=src.n>>>(+)<<<)
Мне ведь еще и not matched нужно обрабатывать.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
merge into DETAILS data
using
(
...
) rs on (data.ITEM_ID = rs.ITEM_ID and data.TYPE_ID = rs.TYPE_ID and data.REF_ID = rs.REF_ID(+) and data.DATE_END is null)
when matched then
  update set DATE_BEG = rs.DATE_BEG, VALUE = nvl(rs.VALUE,0)
  delete where rs.REF_ID is null
when not matched then
  insert (   DETAIL_ID,    ITEM_ID,    REF_ID,    DATE_BEG,    DATE_END,    VALUE)
  values (rs.DETAIL_ID, rs.ITEM_ID, rs.REF_ID, rs.DATE_BEG, rs.DATE_END, rs.VALUE)



Однако в таком запросе у меня никогда не сработает not matched.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37666665
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Мне ведь еще и not matched нужно обрабатывать.писал не тебе и с оговоркой "полу...".
А тебе надо делать транкейт и вставку всея через сохранение во временной таблице.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37667657
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.-2-on (tgt.n=src.n>>>(+)<<<)
Мне ведь еще и not matched нужно обрабатывать.
Однако в таком запросе у меня никогда не сработает not matched.

Did you check my example?

SY.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37667989
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYDid you check my example?
Смотрел, идею понял, но в моем случае это не подойдет.
Мне нужно время от времени выполнять довольно сложную обработку данных в БД.
Для этого у меня используется запрос с большим блоком WITH, в котором задаются параметры обработки. Когда нужно выполнить эту обработку, я загружаю запрос, корректирую блок WITH и запускаю запрос на выполнение.
Изначальный вопрос возник именно потому, что я бы хотел указывать WITH только один раз. Если у меня будет два запроса (неважно, будет это merge и delete, либо select union select), значит перед каждым запросом мне нужно будет указывать выражение WITH и перед запуском запроса нужно будет убедиться, что они одинаковы.
Поэтому если в один запрос все сделать не получится, тогда я лучше оформлю свой запрос как процедуру, с использованием временных таблиц вместо WITH.
...
Рейтинг: 0 / 0
Синхронизация набора данных; merge+delete в одном операторе возможно?
    #37668007
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.SYDid you check my example?
Смотрел, идею понял, но в моем случае это не подойдет.


Почему?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
with source as (
                большой блок WITH
               )
merge
  into target t
  using (
          select  A,
                  B,
                  C,
                  .
                  .
                  .
                  1 indicator
            from  source
         union all
          select  A,
                  B,
                  C,
                  .
                  .
                  .
                  2 indicator
            from  target
            where match-column-set not in (
                                           select  match-column-set
                                             from  source
                                          )
        ) s
  on (
      match-conditions
     )
  when not matched
    then
      insert
        values(
               ...
              )
  when matched
    then
      update
         set ...
      delete where s.indicator = 2
/



И корректируй блок WITH на здоровье.

SY.
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Синхронизация набора данных; merge+delete в одном операторе возможно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]