Оператор объединения для той же таблицы не вставляет новую строку, но обновляет существующую строку в БД Oracle - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь выполнить операцию upsert, используя оператор MERGE для таблицы БД Oracle 12 с именем CONFIG, схема которой выглядит следующим образом:

id | name | value

Если строка с name 'NON_TAXABLE_CODE 'существует, обновите value до' 400 ', иначе вставьте в него новую строку.

Первая попытка

MERGE into CONFIG dest USING (SELECT id, name, value from CONFIG where name = 'NON_TAXABLE_CODE') src
    ON (dest.name = src.name)
WHEN MATCHED THEN
    UPDATE SET dest.value = src.value
WHEN NOT MATCHED THEN
    INSERT (id, name, value) VALUES (src.id, src.name, src.value )

Это обновит значениеесли строка существует, но не вставляет новую строку (если строки не существует)

SecondTry:

MERGE into CONFIG as dest USING VALUES (0, 'NON_TAXABLE_CODE', '400') as src (id, name, value)
    ON dest.name = src.name
WHEN MATCHED THEN
    UPDATE SET dest.value = src.value
WHEN NOT MATCHED THEN
    INSERT (id, name, value) VALUES (src.id, src.name, src.value )


Error report -
SQL Error: ORA-02012: missing USING keyword
02012. 00000 -  "missing USING keyword"
*Cause:    
*Action:

ThirdTry:

MERGE into CONFIG as dest USING (select 0 as id, 'VERTEX_PRODTYPE_NON_TAXABLE' as name, '400' as value from DUAL) as src
    ON dest.name = src.name
WHEN MATCHED THEN
    UPDATE SET dest.value = src.value
WHEN NOT MATCHED THEN
    INSERT (id, name, value) VALUES (src.id, src.name, src.value )

Error report -
SQL Error: ORA-02012: missing USING keyword
02012. 00000 -  "missing USING keyword"
*Cause:    
*Action:

Может кто-нибудь сказать мне, где я здесь не так?Спасибо.

1 Ответ

0 голосов
/ 18 сентября 2018

Проблема в том, что ваш выбор внутри src не возвращает ни одной строки, если условие where не выполняется.Таким образом, он не будет выполнять обновление или вставку в случае сбоя условия.

Чтобы избежать этого, вы можете выбрать значения из двойной таблицы.

MERGE INTO config dest USING (
     SELECT 100 AS id,
            'NON_TAXABLE_CODE' AS name,
            400 AS value
     FROM dual
)
src ON ( dest.name = src.name )
WHEN MATCHED THEN UPDATE SET dest.value = src.value
WHEN NOT MATCHED THEN INSERT (
     id,
     name,
     value ) VALUES (
     src.id,
     src.name,
     src.value );

Это обновит строку, когдаимя совпадает, но вставляет жестко закодированные значения, выбранные из двойного, когда они не совпадают.

DB Fiddle Demo

...