我有一个带有删除标志的简单表(记录应在此列中更新而不是删除):

create table PSEUDODELETETABLE
(
  ID        NUMBER(8) not null, -- PKEY
  NAME      VARCHAR2(50) not null,
  ISDELETED NUMBER(1) default 0 not null
)

插入新记录时,我必须检查是否已存在与主键匹配但ISDELETED = 1的记录。在这种情况下,我必须将ISDELETED更改为0并更新其他列。因此,我正在使用以下Merge-Statement:
merge into ET.PSEUDODELETETABLE TARGET
using (select 1 as ID, 'Horst' as NAME from sys.dual) SOURCE
on (TARGET.ISDELETED = 1 and SOURCE.ID = TARGET.ID)
when matched then
  update set ISDELETED = 0, NAME = SOURCE.NAME
when not matched then
  insert values (SOURCE.ID, SOURCE.NAME, 0);

在Sql Server上,它运行良好,但是Oracle表示:
ORA-38104: Columns referenced in the ON Clause cannot be updated: TARGET.ISDELETED

如果存在IDELETED = 0的匹配记录,我希望将主键冲突作为异常(exception),这就是为什么我无法将“TARGET.ISDELETED = 1”从从句移动到更新语句的原因。

最佳答案

我怀疑在这种情况下,拍摄后看算法会更好。

根据您期望的更常见情况,可以:

  • 更新,如果没有行被更新,则插入;或
  • 插入,如果有密钥冲突,请更新。
  • 08-27 23:28