H2 обновление базы данных или вставка, если не существует - объединить синтаксическая ошибка - PullRequest
0 голосов
/ 16 июня 2019

Я хотел бы сделать оператор "обновить строку" или "вставить, если не существует" в таблицу базы данных H2 с функцией MERGE INTO.

Табель выглядит так:

CREATE TABLE TARGET_TABLE
( cola VARCHAR(10),
colb VARCHAR(10), 
colc VARCHAR(10), 
col1 INT, 
colz VARCHAR(10) 
);

ключевые поля для слияния: 'cola' и 'colb'.

Я попробовал следующее:

MERGE INTO TARGET_TABLE USING DUAL
         ON cola = 'a' AND colb = 'b' 
        WHEN NOT MATCHED THEN 
             INSERT VALUES ('a', 'b', 'cc', 1, 'zz')
        WHEN MATCHED THEN UPDATE SET colc = 'cc', col1 = TARGET_TABLE.col1 + 1  --Aggregation
        colz = CASEWHEN(TARGET_TABLE.colz IS NULL, 'zz', TARGET_TABLE.colz ); --check if it is null

Ошибка: [42001] [42001] Синтаксическая ошибка в операторе SQL "MERGE INTO TARGET_TABLE USING [*] DUAL

Вторая попытка:

MERGE INTO TARGET_TABLE AS T
     (SELECT 'a' cola, 'b' colb, 'cc' colc, 1 col1, 'zz' colz FROM DUAL) as D
    ON (T.cola = D.cola AND
        T.colb = D.colb 
    )
    WHEN MATCHED THEN UPDATE 
        T.colc = D.colc,
        T.col1 = T.col1 + D.col1
        T.colz = CASEWHEN(T.colz IS NULL, D.colz, T.colz );
    WHEN NOT MATCHED THEN
        INSERT VALUES (D.cola, D.colb, D.colc, D.col1, D.colz);

Ошибка: Синтаксическая ошибка в операторе SQL "MERGE INTO TARGET_TABLE AS T [*]

Третья попытка:

MERGE INTO TARGET_TABLE KEY(cola,colb) VALUES( 'a', 'b', 'cc', 1, 'zz')
    WHEN MATCHED THEN UPDATE
        colc = 'cc',
        col1 = TARGET_TABLE.e + 1
        colz = CASEWHEN(TARGET_TABLE.z IS NULL, 'zz', ARGET_TABLE.z );
    WHEN NOT MATCHED THEN
        INSERT VALUES ('a', 'b', 'cc', 1, 'zz');

ОШИБКА: [42000] [42000] Синтаксическая ошибка в операторе SQL «MERGE INTO TARGET_TABLE KEY (cola, colb) VALUES ('a', 'b', 'cc', 1, 'zz') WHEN [*] MATCHED THEN";

Итак, я хотел бы получить следующий результат в таблице:

Если строка еще не существует:

['a', 'b', 'cc', 1, 'zz']

Если он уже существует, обновите некоторые поля

['a', 'b', 'cc', old_value+1, 'z']

или

['a', 'b', 'cc', old_value+1, 'zz']

в зависимости от значения colz было NULL или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...