El SQL original en la pregunta 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')
Falta incondicionalmente una serie de palabras clave Y. La solución aceptada también identifica un problema en la cláusula SET con el uso de table1
en lugar de su alias a
. Eso podría ser material; No puedo probarlo (ver discusión a continuación). Así, en el supuesto de que la actualización se acepta unirse en absoluto, el SQL corregido debería leer:
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')
Esto es lo mismo que la respuesta aceptada (sintaxis corregida). Sin embargo, tengo curiosidad por saber qué versión de Informix está utilizando y acepta la sintaxis FROM (¿quizás XPS?). Estoy usando IDS 11.70.FC2 (3 fixpacks detrás de la versión actual 11.70.FC5) en Mac OS X 10.7.4, y no puedo hacer funcionar la sintaxis UPDATE with FROM. Además, el manual en el Informix 11.70 Information Center de IBM para UPDATE no lo menciona. No estoy seguro de si marcaría la diferencia si está utilizando ODBC o JDBC; no debería, pero estoy usando ESQL/C, que envía el SQL sin cambios al servidor.
La notación es Probé (+
es el símbolo):
+ 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 sintaxis que se muestra no se encuentra un gran número de palabras clave AND. –