powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 9.7. Select from final table + Merge into
3 сообщений из 3, страница 1 из 1
DB2 9.7. Select from final table + Merge into
    #40129980
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я понимаю 9.7 не поддерживает данное сочетание.

Конструкции ON DUPLICATE KEY - вроде как тоже нет.

Что можно сделать в SQL, дабы и insert/update выполнялся шустро и в итоге получить назад измененные записи?

Можно получить назад и только CURRENT_TIMESTAMP, который записан в изменяемое поле.

Хранимка не подходит.

Нашел вот такое, но не уверен что будет работать быстро:
https://stackoverflow.com/questions/51619437/what-is-the-final-table-equivalent-for-merge
...
Рейтинг: 0 / 0
DB2 9.7. Select from final table + Merge into
    #40130013
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Родил этакое.

Код: plsql
1.
2.
3.
4.
SELECT * FROM FINAL TABLE 
(INSERT INTO A(KEY,VALUE)
 WITH B(KEY,VALUE) AS (VALUES (1,'value 1'))
 SELECT * FROM B WHERE NOT EXISTS (SELECT 1 FROM A WHERE A.KEY=B.KEY)



Еще бы и апдейт автоматом... но что бы не 2 раза EXISTS (SELECT 1 FROM A WHERE A.KEY=B.KEY) делать...
...
Рейтинг: 0 / 0
DB2 9.7. Select from final table + Merge into
    #40130492
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat,

Понятие "шустро" - растяжимое.
Это вы только на тестах можете проверить, подходит ли вам скорость или нет.
Оба изменения - максимум одной записи по ключу, если использовать в том виде, как в примере. Вы не добьетесь того, чтоб не использовать [NOT] EXISTS 2 раза.
Алгоритм может работать на несколько входящих записей, т.е. вместо "AS (VALUES (1, 'value 1'))" можно использовать "AS (любой подзапрос, возвращающий: KEY, неключевые поля)", если соответствующим образом исправить UPDATE и INSERT.

Код: sql
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.
CREATE TABLE TEST_MERGE (KEY INT, VALUE VARCHAR (20), TS TIMESTAMP DEFAULT CURRENT TIMESTAMP);

WITH 
  P (KEY, VALUE) AS (VALUES (1, 'value 1'))
, U AS
(
  SELECT *
  FROM FINAL TABLE
  (
    UPDATE TEST_MERGE T
    SET (VALUE, TS) = (SELECT VALUE, CURRENT TIMESTAMP FROM P WHERE P.KEY = T.KEY)
    WHERE EXISTS (SELECT 1 FROM P WHERE P.KEY = T.KEY)
  )
)
, I AS
(
  SELECT *
  FROM FINAL TABLE
  (
    INSERT INTO TEST_MERGE (KEY, VALUE, TS)
    SELECT KEY, VALUE, CURRENT TIMESTAMP 
    FROM P
    WHERE NOT EXISTS (SELECT 1 FROM TEST_MERGE T WHERE T.KEY = P.KEY)
  )
)
SELECT 
  P.KEY
, COALESCE (U.VALUE, I.VALUE) AS VALUE
, COALESCE (U.TS, I.TS) AS TS 
FROM P
LEFT JOIN U ON U.KEY = P.KEY
LEFT JOIN I ON I.KEY = P.KEY
;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 9.7. Select from final table + Merge into
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (10): Анонимы (7), Yandex Bot 1 мин., Bing Bot 4 мин., RePredeclared 4 мин.
x
x
Закрыть


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