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

Sql 同一表的Merge语句不会插入新行,而是更新Oracle DB中的现有行,sql,database,oracle,oracle12c,sql-merge,Sql,Database,Oracle,Oracle12c,Sql Merge,我试图在名为CONFIG的Oracle 12 DB表上使用MERGE语句执行upsert操作,其模式如下: id | name | value 如果存在名为“NON_CODE”的行,请将该值更新为“400”,否则在其中插入新行 初试 如果行存在,则会更新该值,但如果不存在行,则不会插入新行 第二次尝试: 第三: 有人能告诉我哪里出了问题吗? 谢谢。问题是,如果where子句不满足要求,您在src中的select不会返回任何行。因此,当条件失败时,它既不会执行更新也不会执行插入 要避免这种情况,

我试图在名为CONFIG的Oracle 12 DB表上使用MERGE语句执行upsert操作,其模式如下:

id | name | value
如果存在名为“NON_CODE”的行,请将该值更新为“400”,否则在其中插入新行

初试

如果行存在,则会更新该值,但如果不存在行,则不会插入新行

第二次尝试:

第三:

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

问题是,如果where子句不满足要求,您在src中的select不会返回任何行。因此,当条件失败时,它既不会执行更新也不会执行插入

要避免这种情况,可以从双表中选择值

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 );
这将在名称匹配时更新行,但在不匹配时插入从dual中选择的硬编码值


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

要避免这种情况,可以从双表中选择值

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 );
这将在名称匹配时更新行,但在不匹配时插入从dual中选择的硬编码值


尝试删除表别名之前的名称。Oracle在其他上下文中不使用as作为表别名。@GordonLinoff嗨,我试过了。对于第二个,我得到无效的表名错误和第三个,缺少关键字as错误。请尝试删除表别名之前的as。Oracle在其他上下文中不使用as作为表别名。@GordonLinoff嗨,我试过了。对于第二个,我得到了无效的表名错误和第三个,缺少关键字作为错误。非常感谢。成功了。我的尝试3与您的解决方案几乎相同。我只需要删除表别名之前的“as”,并将ON条件括在括号中。再次感谢。@Adhyatmik:嗯……是的,我亲眼看到了。我刚看过你的第一次尝试,写了这个。戈登的评论就足够了!非常感谢你。成功了。我的尝试3与您的解决方案几乎相同。我只需要删除表别名之前的“as”,并将ON条件括在括号中。再次感谢。@Adhyatmik:嗯……是的,我亲眼看到了。我刚看过你的第一次尝试,写了这个。戈登的评论就足够了!
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:
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 );