Как обновить/вставить (Upsert) несколько значений DB2

Я пытаюсь выполнить UPSERT в DB2 9.7 без создания временной таблицы для слияния. Я указываю значения в качестве параметров, однако всегда получаю синтаксическую ошибку для запятой, разделяющей значения, когда я пытаюсь включить более одной строки значений.

MERGE INTO table_name AS tab 
USING (VALUES 
        (?,?), 
        (?,?)
    ) AS merge (COL1, COL2) 
    ON tab.COL1 = merge.COL1 
    WHEN MATCHED THEN 
        UPDATE SET tab.COL1 = merge.COL1, 
                   tab.COL2 = merge.COL2
    WHEN NOT MATCHED THEN 
        INSERT (COL1, COL2) 
        VALUES (merge.COL1, merge.COL2)

Я также попробовал ответ teknopaul из Есть ли в DB2 "вставка или обновление" оператор, но получил другую синтаксическую ошибку, жалующуюся на использование SELECT.

Кто-нибудь знает, как правильно включить таблицу со значениями в мое слияние, фактически не создавая/удаляя ее в базе данных?


person Crobota    schedule 18.07.2016    source источник
comment
это может помочь вам ibm.com/developerworks/community/ блоги/SQLTips4DB2LUW/запись/   -  person Mustafa DOGRU    schedule 19.07.2016
comment
Вы всегда заполняете все строки? Или только подмножество?   -  person Clockwork-Muse    schedule 19.07.2016
comment
@Clockwork-Muse Да, все строки. Я хочу, чтобы он обновлял записи, если они уже есть, и вставлял их, если их нет.   -  person Crobota    schedule 19.07.2016
comment
Не используйте зарезервированное слово для корреляционного имени: AS merge (COL1, COL2).   -  person mustaccio    schedule 19.07.2016
comment
@mustaccio Хороший вопрос ... однако я все еще получаю ту же ошибку: ERROR [42601] [IBM][CLI Driver][DB2] SQL0104N An unexpected token "," was found following "". Expected tokens may include: "FOR )". SQLSTATE=42601   -  person Crobota    schedule 19.07.2016
comment
Я не знаю, это прекрасно работает в версии 10.5. Некоторые синтаксические ограничения могли быть ослаблены с версии 9.7. Попробуйте добавить TABLE: USING TABLE (VALUES ... ) AS m (COL1, COL2)   -  person mustaccio    schedule 19.07.2016
comment
@mustaccio ERROR [42601] [IBM][CLI Driver][DB2] SQL0199N The use of the reserved word "TABLE" following "" is not valid. Expected tokens may include: "(". SQLSTATE=42601 Исходный код выше работает на другом сервере. Разница в том, что это не на мейнфрейме...   -  person Crobota    schedule 19.07.2016
comment
Какая у вас версия/платформа? DB2 версии 9.7 для z/OS не существует.   -  person mustaccio    schedule 19.07.2016
comment
@mustaccio DB2 8.2.1 Я верю   -  person Crobota    schedule 19.07.2016
comment
Ни DB2 8 для z/OS, ни DB2 8.x для LUW не поддерживали оператор MERGE. Возможно, вам нужно выяснить, с какой версией на какой платформе вы имеете дело, прежде чем тратить больше времени. Вы указали 9.7 (при условии LUW) в вопросе, а затем в комментариях сказали, что это 8.2.1 на мейнфрейме.   -  person mustaccio    schedule 19.07.2016


Ответы (1)


Я считаю, что вам нужно что-то вроде USING (SELECT * FROM VALUES ( ...) ) AS ...

person user10552590    schedule 24.10.2018