powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?
5 сообщений из 5, страница 1 из 1
Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?
    #39711282
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть к примеру простейший автоинкремент:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
(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));



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

Не прокатывает.

В чем я косячу?
...
Рейтинг: 0 / 0
Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?
    #39711289
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или как альтернативно получить уникальный ID не прибегая собственно к средствам autoinc самой базы?
...
Рейтинг: 0 / 0
Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?
    #39711290
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И без хранимок. Имено на голом SQL в одно действие.
...
Рейтинг: 0 / 0
Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?
    #39711483
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rgreat,

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

Если надо получить одним запросом вставленные и/или измененные записи, то операции 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.
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 ненужную часть.
...
Рейтинг: 0 / 0
Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?
    #39711860
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Как вытащить новые рекорды (FINAL TABLE) от результата MERGE?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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