当前位置: 首页 > 面试题库 >

ORA-38104:ON子句中引用的列无法更新

蒲德曜
2023-03-14
问题内容

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

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的匹配记录,我希望将主键冲突作为例外,这就是为什么我不能将“ TARGET.ISDELETED =
1”从从句移动到更新语句的原因。


问题答案:

在这种情况下,我怀疑您最好使用“先看后看”算法。

根据您期望的更为常见的情况,可以执行以下任一操作:

  • 更新,如果没有行被更新,则插入;或者
  • 插入,如果有按键冲突,请更新。


 类似资料:
  • 问题内容: 我有以下MySQL查询: 我收到此错误: #1054-‘on子句’中的未知列’p.id’ 据我所知,查询看起来是正确的,知道发生什么了吗? 问题答案: 不要混合使用ANSI-89样式和ANSI-92样式的连接。它们具有不同的优先级,这可能导致混乱的错误,这就是这里发生的情况。您的查询的解释如下: 在上面的示例中,在甚至考虑了逗号样式的连接之前,首先评估使用JOIN关键字的连接。届时该表

  • 我试图使用和子句以及子查询来删除另一个表上的查询所给出的行,该表与我要删除的表是1比1,但Oracle 11g2向我抛出了一个完全没有帮助的ORA-00900错误,如下面的SQL fiddle: http://sqlfiddle.com/#!4/93171/1 对于那些无法使用SQLFIDLE的用户,我使用的模式/初始负载是(我使用而不是来实现测试可移植性,“野生”数据使用): 我想说的是: (自

  • 当我想比较这两列时,它向我显示了这个menssage,没有“where子句”,没有任何错误,但是当我写“where”时,错误就出现了 这是我的sql句子: 月经错误:ORA-01722:无效号码01722。00000 - “无效号码” *原因:指定的号码无效。*操作: 指定一个有效的数字。

  • 问题内容: 我今天输入了错误的查询,但它仍然有效,并给出了预期的结果。我的意思是运行此查询: 但是我不小心跑了这个查询 (请注意,而不是最后一个子句中的) 并且都从用户ID返回了正确的员工ID。 这两个查询有什么区别?第二种形式是否仅联接满足条件的2个表的成员,而第一种形式将联接整个表,然后运行查询?一个效率比另一个效率高吗?还有其他我想念的东西吗? 谢谢! 问题答案: 对于这样的内部联接,它们在

  • 问题内容: 我懂了 “无效的列名daysdiff”。 Maxlogtm是日期时间字段。是让我发疯的小东西。 问题答案: 通常,您不能在子句中引用字段别名。(将其视为包括别名在内的全部内容,在该子句之后应用。) 但是,如其他答案所述,您可以强制将SQL视为在子句之前进行处理。通常使用圆括号来强制操作的逻辑顺序,或者使用通用表表达式(CTE)来完成此操作: 括号/子选择: 或参阅亚当的CTE版本答案。

  • 问题内容: 我正在尝试在子句中构建case / if语句。 问题在于该列包含文本和数字。我要与之比较的列是一个整数。 有没有一种方法可以检测列是否包含字符或数字,然后将其设置为0,然后将其设置为0? 这是一个伪查询可以帮助您: 问题答案: 您正在寻找IsNumeric,但它并不总是有效(+,-和。是数字),因此您需要使用GBN所描述的解决方案,即在您的varchar中添加.0e0