同一表的合并语句不会插入新行,而是更新 Oracle DB 中的现有行

Adh*_*mik 1 sql database oracle sql-merge oracle12c

我正在尝试使用MERGEOracle 12 DB 表上的语句执行 upsert 操作CONFIG,该表的架构如下所示:

id | name | value
Run Code Online (Sandbox Code Playgroud)

如果存在带有“NON_TAXABLE_CODE”的行name,请将其更新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 )
Run Code Online (Sandbox Code Playgroud)

如果该行存在,这将更新该值,但不会插入新行(如果不存在行)

第二次尝试:

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:
Run Code Online (Sandbox Code Playgroud)

第三次尝试:

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:
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我哪里出了问题吗?谢谢。

Kau*_*yak 5

问题是,如果不满足 where 子句,则 src 内的选择不会返回任何行。因此,当条件失败时,它既不会执行更新,也不会执行插入。

为了避免这种情况,您可以从双表中选择值。

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 );
Run Code Online (Sandbox Code Playgroud)

这将在名称匹配时更新行,但在不匹配时插入从对偶中选择的硬编码值。

DB 小提琴演示