powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Танцы вокруг UPDATE
6 сообщений из 6, страница 1 из 1
Танцы вокруг UPDATE
    #32073381
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть 2 таблицы, связанные по ID.
Например:

Код: plaintext
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.
DROP TABLE TABLE_X1;
CREATE TABLE TABLE_X1
(
ID NUMBER( 10 ) primary key,
NUMBER1 NUMBER( 10 ),
NUMBER2 NUMBER( 10 )
);

INSERT INTO TABLE_X1 (ID, NUMBER1,NUMBER2) VALUES ( 1 , 66 , 20 );
INSERT INTO TABLE_X1 (ID, NUMBER1,NUMBER2) VALUES ( 2 , 10 , 80 );
INSERT INTO TABLE_X1 (ID, NUMBER1,NUMBER2) VALUES ( 5 , 18 , 60 );
INSERT INTO TABLE_X1 (ID, NUMBER1,NUMBER2) VALUES ( 7 , 64 , 44 );
COMMIT;

DROP TABLE TABLE_X2;
CREATE TABLE TABLE_X2
(
ID NUMBER( 10 ) primary key,
NUMBER1 NUMBER( 10 ),
NUMBER2 NUMBER( 10 )
);

INSERT INTO TABLE_X2 (ID, NUMBER1,NUMBER2) VALUES ( 1 , 77 , 11 );
INSERT INTO TABLE_X2 (ID, NUMBER1,NUMBER2) VALUES ( 2 , 19 , 10 );
INSERT INTO TABLE_X2 (ID, NUMBER1,NUMBER2) VALUES ( 5 , 55 , 1 );
INSERT INTO TABLE_X2 (ID, NUMBER1,NUMBER2) VALUES ( 7 , 16 , 66 );
COMMIT;


Теперь нужно одним SQL-предложением проUPDATEить значение в таблице 1 на значения таблицы 2:

Код: plaintext
1.
UPDATE TABLE_X1 A
SET (A.NUMBER1, A.NUMBER2) = (SELECT NUMBER1, NUMBER2 FROM TABLE_X2 WHERE ID=A.ID);


Теперь вопрос: как сделать и можно ли сделать вообще, чтобы если значения NUMBER1 и/или NUMBER2 равны NULL, то в таблице TABLE_X1 значения NUMBER1 и NUMBER2 не апдейтились на NULL, а оставляли бы свои предыдущие не NULL значения.

Можно, естественно, написать ROW-триггер на апдейт для таблицы 2:

Код: plaintext
1.
2.
3.
4.
5.
6.
...

:NEW.NUMBER1 := NVL(:NEW.NUMBER1, :OLD.NUMBER1);
:NEW.NUMBER2 := NVL(:NEW.NUMBER2, :OLD.NUMBER2);
...

-- ну или через IFы, а не NVL, не важно


но триггер мне снизит скорость апдейта (а снизит ли? и на сколько?, стоит потестить), что в данном случае недопустимо.

Можно ли вообще настроить сессию не апдейта на NULL?
Писать в таблице NUMBER1 NUMBER(10) NOT NULL - не возможно, как по условию задачи, так и потому, что NULL значения могут быть, но не при данном массовом апдейте.
...
Рейтинг: 0 / 0
Танцы вокруг UPDATE
    #32073385
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленькие поправки:

...чтобы если значения NUMBER1 и/или NUMBER2 равны NULL
Имеется в виде NULL значения таблицы 2, откуда извлекуются значения для апдейта таблицы 1.

Можно, естественно, написать ROW-триггер на апдейт для таблицы 2
Естественно, таблицы 1.
...
Рейтинг: 0 / 0
Танцы вокруг UPDATE
    #32073392
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так, без всяких триггеров:
Код: plaintext
1.
2.
3.
4.
5.
6.
UPDATE TABLE_X1 A
  SET (A.NUMBER1, A.NUMBER2) = (SELECT 
        decode(NUMBER1,null,a.NUMBER1,NUMBER1), 
        decode (NUMBER2,null,a.NUMBER2,NUMBER2) 
 FROM 
  TABLE_X2 WHERE ID=A.ID);
...
Рейтинг: 0 / 0
Танцы вокруг UPDATE
    #32073404
none
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помните, СофтБилдер, как в Матрице:
"You are my personal Jesus Christ".

Здесь можно тоже самое сказать и о Вас.
Спасибо, ваш пример работает.
...
Рейтинг: 0 / 0
Танцы вокруг UPDATE
    #32073411
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ok, пишите если что, поможем чем сможем :)
...
Рейтинг: 0 / 0
Танцы вокруг UPDATE
    #32074199
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я чего-то тормознул. Можно было проще:
Код: plaintext
1.
2.
3.
4.
5.
6.
UPDATE TABLE_X1 A 
SET (A.NUMBER1, A.NUMBER2) = (SELECT
            nvl(NUMBER1,a.NUMBER1), 
            nvl(NUMBER2,a.NUMBER2) 
FROM 
TABLE_X2 WHERE ID=A.ID);
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Танцы вокруг UPDATE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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