2010-06-21 76 views
2

INFORMIX-SE 7.32使用表或視圖:錯誤360:無法修改子查詢

我收到錯誤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; 

任何想法?

+0

爲什麼甲骨文和MySQL標籤爲這個特定Informix的問題嗎? – 2010-06-21 10:02:50

+1

@ Tony-因爲SQL更新語句本身不包含任何INFORMIX特定的超集,並且也許有經驗的Oracle或MySQL程序員可以回答這個問題(更多的讀者)。 – 2010-06-21 13:18:49

+2

但是錯誤是一個Informix錯誤,Oracle不會爲這個SQL提出任何錯誤,它會工作得很好。 – 2010-06-21 13:45:02

回答

4

您正在嘗試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 ...);

+0

那麼是否有另一種方法來定位max(transaction.num)以更新它? – 2010-06-21 13:22:49

+3

@Frank爲什麼不先運行'select max(transaction.num)from transaction'並且使用查詢中的值。 – Amarghosh 2010-06-21 13:25:19

+1

@Frank:Amarghosh是正確的 - SE中存在的侷限性在IDS和其他更現代和更有能力的DBMS中不存在,這就是其中之一。有了IDS,你可以使用一個SEQUENCE。對於SE,您可以創建一個單行臨時表來保存最大值並在UPDATE語句中使用它。如果我從其他問題中瞭解到,您主要使用單用戶系統,這將足夠安全。如果你正在處理一個多用戶系統(就像大多數人一樣),那麼你必須更加擔心TOCTOU(檢查時間,使用時間)窗口的變化。 – 2010-06-21 17:47:07