問題の元のSQLは次のとおりです。
update table1
set table1.code = 100
from table1 a, table2 b, table3 c
where a.key = c.key
a.no = b.no
a.key = c.key
a.code = 10
b.tor = 'THE'
a.group = 4183
a.no in ('1111','1331','1345')
これには、一連のANDキーワードが無条件に欠落しています。table1
受け入れられた解決策は、エイリアスの代わりにを使用して、SET句の問題も識別しますa
。それは重要かもしれません。テストできません(以下の説明を参照)。したがって、join UPDATEがまったく受け入れられると仮定すると、修正されたSQLは次のようになります。
UPDATE table1
SET a.code = 100
FROM table1 a, table2 b, table3 c
WHERE a.key = c.key
AND a.no = b.no
AND a.key = c.key
AND a.code = 10
AND b.tor = 'THE'
AND a.group = 4183
AND a.no IN ('1111','1331','1345')
これは、(構文が修正された)受け入れられた回答と同じです。ただし、FROM構文(おそらくXPS?)を受け入れる使用しているInformixのバージョンを知りたいです。Mac OS X10.7.4でIDS11.70.FC2(現在の11.70.FC5バージョンの背後にある3つのフィックスパック)を使用していますが、FROM構文を使用したUPDATEを機能させることができません。さらに、IBMのInformix 11.70 Information Center for UPDATEのマニュアルには、それについては記載されていません。ODBCとJDBCのどちらを使用している場合でも、違いが生じるかどうかはわかりません。すべきではありませんが、SQLを変更せずにサーバーに送信するESQL/Cを使用しています。
私が試した表記は(+
プロンプトです):
+ BEGIN;
+ CREATE TABLE a(a INTEGER NOT NULL, x CHAR(10) NOT NULL, y DATE NOT NULL);
+ INSERT INTO a(a, x, y) VALUES(1, 'obsoletely', '2012-04-01');
+ INSERT INTO a(a, x, y) VALUES(2, 'absolutely', '2012-06-01');
+ CREATE TABLE b(b INTEGER NOT NULL, p CHAR(10) NOT NULL, q DATE NOT NULL);
+ INSERT INTO b(b, p, q) VALUES(3, 'daemonic', '2012-07-01');
+ SELECT * FROM a;
1|obsoletely|2012-04-01
2|absolutely|2012-06-01
+ SELECT * FROM b;
3|daemonic|2012-07-01
+ SELECT *
FROM a, b
WHERE a.a < b.b
AND b.p MATCHES '*a*e*';
1|obsoletely|2012-04-01|3|daemonic|2012-07-01
2|absolutely|2012-06-01|3|daemonic|2012-07-01
+ UPDATE a
SET x = 'crumpet'
FROM a, b
WHERE a.a < b.b
AND b.p MATCHES '*a*e*';
SQL -201: A syntax error has occurred.
SQLSTATE: 42000 at <<temp>>:23
+ SELECT * FROM a;
1|obsoletely|2012-04-01
2|absolutely|2012-06-01
+ ROLLBACK;