Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?  [new]
rgreat
Member

Откуда:
Сообщений: 5211
Есть к примеру простейший автоинкремент:

(MERGE INTO ICG1.GPS_AUTOINC AS MT USING
(SELECT *
 FROM TABLE (SELECT 'Test' NAME,COALESCE(MAX(VALUE),0)+1 VALUE
             FROM TEST_TABLE
             WHERE NAME='Test')
 ) AS VT(NAME, VALUE) ON (MT.NAME = VT.NAME)
WHEN MATCHED THEN
UPDATE SET VALUE = VT.VALUE
WHEN NOT MATCHED THEN
INSERT (NAME, VALUE) VALUES (VT.NAME, VT.VALUE));


Как вытащить измененные предыдущим запросом записи?
SELECT NAME, VALUE FROM FINAL TABLE (<..>)
Не прокатывает.

В чем я косячу?
1 окт 18, 21:09    [21691892]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?  [new]
rgreat
Member

Откуда:
Сообщений: 5211
Или как альтернативно получить уникальный ID не прибегая собственно к средствам autoinc самой базы?
1 окт 18, 21:17    [21691901]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?  [new]
rgreat
Member

Откуда:
Сообщений: 5211
И без хранимок. Имено на голом SQL в одно действие.
1 окт 18, 21:18    [21691902]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 4860
rgreat,

MERGE не может участвовать в data-change-table-reference.

Если надо получить одним запросом вставленные и/или измененные записи, то операции UPDATE и INSERT надо разделять.
+ Пример
DECLARE GLOBAL TEMPORARY TABLE SESSION.GPS_AUTOINC (NAME VARCHAR(10), VALUE INT) WITH REPLACE ON COMMIT PRESERVE ROWS NOT LOGGED;
INSERT INTO SESSION.GPS_AUTOINC values ('Test1', -1);

WITH VT (NAME, VALUE) AS (
SELECT NAME, VALUE
FROM TABLE(VALUES ('Test1', 1), ('Test2', 2)) T (NAME, VALUE)
)
, U AS (
SELECT *
FROM FINAL TABLE (
UPDATE SESSION.GPS_AUTOINC MT
SET VALUE=(SELECT VT.VALUE FROM VT WHERE VT.NAME=MT.NAME)
WHERE EXISTS (SELECT 1 FROM VT WHERE VT.NAME=MT.NAME)
)
)
, I AS (
SELECT *
FROM FINAL TABLE (
INSERT INTO SESSION.GPS_AUTOINC
SELECT VT.NAME, VT.VALUE FROM VT
WHERE NOT EXISTS (SELECT 1 FROM SESSION.GPS_AUTOINC MT WHERE MT.NAME=VT.NAME)
)
)
SELECT 'UPDATED' TYPE, U.* FROM U
  UNION ALL
SELECT 'INSERTED' TYPE, I.* FROM I;

Ну и если надо либо вставленные, либо измененные, то убрать из последнего UNION ALL ненужную часть.
2 окт 18, 10:02    [21692240]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?  [new]
rgreat
Member

Откуда:
Сообщений: 5211
Спасибо.
2 окт 18, 17:18    [21693029]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить