Lo SQL originale nella domanda era:
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')
Questo manca incondizionatamente una serie di parole chiave AND. La soluzione accettata identifica anche un problema nella clausola SET con l'uso di table1
invece del suo alias a
. Potrebbe essere materiale; Non riesco a testarlo (vedi discussione sotto). Quindi, supponendo che l'aggiornamento è accettata unirsi a tutti, la SQL corretto dovrebbe contenere:
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')
questo è lo stesso come la risposta accettata (la sintassi corretta). Tuttavia, sono curioso di sapere quale versione di Informix stai usando che accetta la sintassi FROM (forse XPS?). Sto usando IDS 11.70.FC2 (3 fix pack dietro la versione corrente 11.70.FC5) su Mac OS X 10.7.4, e non riesco a far funzionare la sintassi UPDATE con FROM. Inoltre il manuale su IBM Informix 11.70 Information Center per UPDATE non lo menziona. Non sono sicuro che potrebbe fare alcuna differenza se stai usando ODBC o JDBC; non dovrebbe, ma sto usando ESQL/C, che invia lo SQL invariato al server.
La notazione ho provato è (+
è il prompt):
+ 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;
La sintassi mostrata manca un gran numero di e parole chiave. –