更新时标识符无效 (Oracle)

Posted

技术标签:

【中文标题】更新时标识符无效 (Oracle)【英文标题】:Invalid Identifier on Update (Oracle) 【发布时间】:2015-10-13 16:48:39 【问题描述】:

我尝试执行以下命令:

UPDATE DB_TEST.STOCK_ITEMS
   SET STATUS = (SELECT *
                   FROM (SELECT STOCK_ITEM_STATUS
                           FROM DB_TEST.STOCK_ITEMS_HISTORY
                          WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID
                          ORDER BY CHANGED_ON DESC, ID DESC)
                  WHERE ROWNUM <= 1)
 WHERE EXISTS (SELECT *
                 FROM DB_TEST.STOCK_ITEMS_HISTORY
                WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID);

但我得到了错误:

SQL-Error: ORA-00904: "DB_TEST"."STOCK_ITEMS"."ID": invalid identifier

我查看了 Oracle 错误,但我得到的只是我应该使用了错误或缺少的列名,但 DB_TEST.STOCK_ITEMS.ID 字段确实存在。

还有哪些其他原因会导致此错误?

【问题讨论】:

你不能用一组数据更新一个列SET STATUS = (SELECT * ... ) 没有数据库会知道该字段上放什么数据。您可能正在寻找这个:dba.stackexchange.com/a/3034/42478 @JorgeCampos 。 . .阅读查询。子查询只返回一个值。 【参考方案1】:

Oracle 将表的范围限制为一级子查询。这是一种使用keep 解决您的问题的方法:

UPDATE DB_TEST.STOCK_ITEMS
  SET STATUS = (SELECT MAX(STOCK_ITEM_STATUS) KEEP (DENSE_RANK FIRST ORDER BY CHANGED_ON DESC, ID DESC)
                FROM DB_TEST.STOCK_ITEMS_HISTORY
                WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID
               )
  WHERE EXISTS (SELECT 1
                FROM DB_TEST.STOCK_ITEMS_HISTORY
                WHERE STOCK_ITEM_ID = DB_TEST.STOCK_ITEMS.ID
               );

【讨论】:

“OVER”是“FIRST”和“ORDER”之间的错字吗?它会引发错误。 @Palmi 。 . .是的,是的。

以上是关于更新时标识符无效 (Oracle)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到:[Oracle][ODBC][Ora]ORA-00904:标识符无效

过程中 UPDATE oracle 中的变量:标识符无效

尽管列在表中,但标识符无效

尝试在 Oracle Sql 中将列值更改为默认值时标识符无效

Hibernate 自动更新表出错 建表或添加列,提示标识符无效

Oracle 数据库列定义不明确/标识符无效