错误 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】:您正在尝试 UPDATE
表 transaction
并使用 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:无法修改子查询中使用的表或视图的主要内容,如果未能解决你的问题,请参考以下文章