Гость
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 9.7. Select from final table + Merge into / 3 сообщений из 3, страница 1 из 1
27.01.2022, 16:45
    #40129980
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 9.7. Select from final table + Merge into
Как я понимаю 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
27.01.2022, 18:13
    #40130013
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 9.7. Select from final table + Merge into
Родил этакое.

Код: 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
29.01.2022, 12:00
    #40130492
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DB2 9.7. Select from final table + Merge into
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
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / DB2 9.7. Select from final table + Merge into / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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