Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / merge update по условию / 13 сообщений из 13, страница 1 из 1
27.07.2018, 08:00
    #39679975
alx71
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table t1
(
c1 number,
c2 number,
c3 number,
constraint t1_pk primary key (c1)
)
;
create table t2
(
c1 number,
c2 number,
c3 number,
constraint t2_pk primary key (c1)
)
;


Хочется написать такой merge:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
merge into t2
using (select * from t1)
on (t1.c1=t2.c1)
when matched then
 update set t2.c2= t1.c2 where t2.c2 != t1.c2
 update set t2.c3= t1.c2 where t2.c3 != t1.c3
when not matched then
 insert  (t2.c1,t2.c2,t2c3) values (t1.c1,t1.c2,t1.c3)
;



Вариант update set t2.c2=case... не подойдет, т.к. вызовет срабатывания триггеров.

Возможно ли?
...
Рейтинг: 0 / 0
27.07.2018, 08:29
    #39679977
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
alx71Возможно ли?Конечно же, нет.
...
Рейтинг: 0 / 0
27.07.2018, 10:34
    #39680039
роман23t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
alx71[src PLSQL]
т.к. вызовет срабатывания триггеров.


А что имелось ввиду? причем тут наличие case и вызов триггера?
...
Рейтинг: 0 / 0
27.07.2018, 11:16
    #39680067
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
роман23t,

Наверно что-то типа:
Код: plsql
1.
 update set t2.c2= decode(t2.c2,t1.c2,t2.c2,t1.c2), t2.c3= decode(t2.c3,t1.c3,t2.c3,t1.c2) where t2.c2 != t1.c2 or t2.c3 != t1.c3



т.е. не хотят t2.c2= t2.c2 потому что ...
...
Рейтинг: 0 / 0
27.07.2018, 12:45
    #39680141
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
роман23talx71т.к. вызовет срабатывания триггеров.
А что имелось ввиду? причем тут наличие case и вызов триггера?наверняка
Код: plsql
1.
update of
...
Рейтинг: 0 / 0
27.07.2018, 13:24
    #39680184
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
Сделайте запуск триггеров зависимым от контекста.
...
Рейтинг: 0 / 0
27.07.2018, 13:37
    #39680197
alx71
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
MaximaXXLроман23t,

Наверно что-то типа:
Код: plsql
1.
 update set t2.c2= decode(t2.c2,t1.c2,t2.c2,t1.c2), t2.c3= decode(t2.c3,t1.c3,t2.c3,t1.c2) where t2.c2 != t1.c2 or t2.c3 != t1.c3



т.е. не хотят t2.c2= t2.c2 потому что ...

Да, или так:
Код: plsql
1.
update set t2.c2=case when t2.c2=t1.c2 when t2.c2 else t1.c2 end
...
Рейтинг: 0 / 0
27.07.2018, 13:50
    #39680207
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
alx71
Код: plsql
1.
case when t2.c2=t1.c2 when t2.c2 else t1.c2 end

Масло масляное.
...
Рейтинг: 0 / 0
30.07.2018, 11:01
    #39680919
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
Код: plsql
1.
2.
3.
4.
5.
6.
7.
merge into t2
using (select * from t1 join t2 on t1.c1 = t2.c1 and (t2.c2 != t1.c2 or t2.c3 != t1.c3)) t1
on (t1.c1=t2.c1)
when matched then
 update set t2.c2= t1.c2, t2.c3= t1.c2
when not matched then
 insert  (t2.c1,t2.c2,t2c3) values (t1.c1,t1.c2,t1.c3)



Но, опять же, t2.c2 будут апдейтиться даже если t2.c2=t1.c2, но t2.c3 != t1.c3.
...
Рейтинг: 0 / 0
30.07.2018, 11:13
    #39680930
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
Dshedoo
Код: plsql
1.
2.
3.
4.
5.
6.
7.
merge into t2
using (select * from t1 join t2 on t1.c1 = t2.c1 and (t2.c2 != t1.c2 or t2.c3 != t1.c3)) t1
on (t1.c1=t2.c1)
when matched then
 update set t2.c2= t1.c2, t2.c3= t1.c2
when not matched then
 insert  (t2.c1,t2.c2,t2c3) values (t1.c1,t1.c2,t1.c3)



Но, опять же, t2.c2 будут апдейтиться даже если t2.c2=t1.c2, но t2.c3 != t1.c3.У merge есть where clause.
...
Рейтинг: 0 / 0
30.07.2018, 11:29
    #39680938
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
AmKadУ merge есть where clause.
Cогласен, перемудрил.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
merge into t2
using t1
on (t1.c1=t2.c1)
when matched then
 update set t2.c2= t1.c2, t2.c3= t1.c3 where t2.c2 != t1.c2 or t2.c3 != t1.c3
when not matched then
 insert  (t2.c1,t2.c2,t2c3) values (t1.c1,t1.c2,t1.c3)
...
Рейтинг: 0 / 0
30.07.2018, 11:37
    #39680945
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
DshedooAmKadУ merge есть where clause.
Cогласен, перемудрил.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
merge into t2
using t1
on (t1.c1=t2.c1)
when matched then
 update set t2.c2= t1.c2, t2.c3= t1.c3 where t2.c2 != t1.c2 or t2.c3 != t1.c3
when not matched then
 insert  (t2.c1,t2.c2,t2c3) values (t1.c1,t1.c2,t1.c3)



а теперь при t2.c3 != t1.c3 будет update t2.c2= t1.c2 что не соответствует постановке
...
Рейтинг: 0 / 0
30.07.2018, 12:08
    #39680969
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
merge update по условию
Dshedoo
Код: plsql
1.
t2.c2 != t1.c2 or t2.c3 != t1.c3

А это условие не даст обновить NULL-значение.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / merge update по условию / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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