错误 360:无法修改子查询中使用的表或视图

Posted

技术标签:

【中文标题】错误 360:无法修改子查询中使用的表或视图【英文标题】:Error 360: Cannot modify table or view used in subquery 【发布时间】:2010-06-21 09:52:01 【问题描述】:

INFORMIX-SE 7.32:

当我尝试执行以下语句时遇到错误 360:

update transaction
   set transaction.colx = (select tab1.cola from tab1)
 where transaction.num  = (select max(transaction.num) from transaction)
   and transaction.colx IS NULL;

有什么想法吗?

【问题讨论】:

为什么这个 Informix 特定问题的 Oracle 和 mysql 标记? @Tony- 因为 SQL 更新语句本身不包含任何 INFORMIX 特定的超集,也许有经验的 Oracle 或 MySQL 程序员可以回答这个问题(更多观众)。 但是这个错误是一个 Informix 错误,Oracle 不会为这个 SQL 引发任何错误,它可以正常工作。 【参考方案1】:

您正在尝试 UPDATEtransaction 并使用 SELECT MAX 使用相同的查询从同一个表中读取。你不能那样做。

Subquery restrictions

通常,您不能在子查询中修改表并从同一个表中进行选择。例如,此限制适用于以下形式的语句:DELETE FROM t WHERE ... (SELECT ... FROM t ...);UPDATE t ... WHERE col = (SELECT ... FROM t ...);INSERT|REPLACE INTO t (SELECT ... FROM t ...);

【讨论】:

那么有没有替代方法来定位 max(transaction.num) 以更新它? @Frank 为什么不先运行select max(transaction.num) from transaction 并使用查询中的值。 @Frank:Amarghosh 是正确的——SE 中存在 IDS 和其他更现代、更强大的 DBMS 中不存在的限制,这就是其中之一。使用 IDS,您可以使用 SEQUENCE。使用 SE,您可以创建一个单行临时表来保存最大值并在 UPDATE 语句中使用它。如果,正如我从其他问题中了解到的那样,您主要使用单用户系统,那将是足够安全的。如果您正在处理一个多用户系统(就像大多数人一样),那么您将不得不更加担心 TOCTOU(检查时间,使用时间)窗口以进行更改。

以上是关于错误 360:无法修改子查询中使用的表或视图的主要内容,如果未能解决你的问题,请参考以下文章

sql server解决无法删除修改拥有外键约束的表或表的记录字段

Oracle 基础——视图

ORA-00942: 写入数据库中的表时表或视图不存在错误

bcp文件的参数含义

在 SQL 中的表或视图上添加索引

表单出现错误“预期的表或查询集,而不是 str”