2012-06-07 10 views
6

¿Es esta la sintaxis correcta para una actualización de Informix?actualizar la tabla de Informix con combinaciones

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') 

tengo la genérica -201 'Un error de sintaxis se ha producido' mensaje, pero no puede ver lo que está mal.

+0

La sintaxis que se muestra no se encuentra un gran número de palabras clave AND. –

Respuesta

6

su error de sintaxis es table1.code

set table1.code = 100 

cambio esto en

set a.code = 100 

código completo

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') 
+0

hola, tengo una consulta de actualización/combinación simular pero en lugar de establecer el valor a.code en valor estático de 100, necesito hacer referencia a un valor de columna en una tabla de unión. He intentado 'table3.key' y 'c.key' pero sin suerte. – emeraldjava

+0

@emeraldjava publique su código para ayudarlo. – Esen

+0

Desafortunadamente, esto causa un error de sintaxis en Informix 11.50. (Para obtener la versión del servidor de Informix, ejecute SQL 'seleccione primero 1 dbinfo (" versión "," completo ") de systables;') – Rockallite

3

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; 
+0

Encontré esta página en los documentos de XPS mientras buscaba una solución, por lo que parece que su suposición era correcta . http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqlt.doc/sqltmst150.htm – Frosty840

+0

Lamentablemente, el enlace en la respuesta de @ Frosty840 fue 404 'not found 'cuando se marcó el 11-11-2014. –

5

Por desgracia, la respuesta aceptada provoca error de sintaxis en Informix Dynamic Server Versión 11.50.

Ésta es la única manera de evitar el error de sintaxis:

update table1 
set code = (
    select 100 
    from table2 b, table3 c 
    where table1.key = c.key 
    and table1.no = b.no 
    and table1.key = c.key 
    and table1.code = 10 
    and b.tor = 'THE' 
    and table1.group = 4183 
    and table1.no in ('1111','1331','1345') 
) 

Por cierto, a get Informix version, ejecute el siguiente código SQL:

select first 1 dbinfo("version", "full") from systables; 
+0

Lo mismo vale para la versión 11.70 – axxis

+0

Lo mismo vale para la versión 11.10 – MPaul

0

Para Informix SE 7,25 ...

  1. ACTUALIZACIÓN ... DESDE ...sintaxis no existe
  2. También "No se puede modificar la tabla o vista se utiliza en subconsulta" que se da cuando se utiliza Rockallite's answer

Otra solución sería dividirlo en dos consultas:

En primer lugar, obtener los ROWIDs para los registros requeridos (filtrada en múltiples tablas):

SELECT a.ROWID 
    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') 

poner el resultado en una cadena separada por comas.

A continuación, actualice sólo aquellos registros de la tabla principal, donde el ROWID se encontró en la primera consulta:

UPDATE table1 a 
    SET a.code = 100 
WHERE a.ROWID in ([comma separated ROWIDs found above]) 
0

Depende de la versión que está utilizando. Si está utilizando al menos 11.50 la mejor solución sería:

MERGE INTO table1 as t1 
USING table2 as t2 
    ON t1.ID = t2.ID 
WHEN MATCHED THEN UPDATE set (t1.col1, t1.col2) = (t2.col1, t2.col2); 

El ACTUALIZACIÓN - SET - DE - Sintaxis fue eliminado en las versiones superiores a 11,50.

Si está utilizando una versión anterior se puede ir con

UPDATE t SET a = t2.a FROM t, t2 WHERE t.b = t2.b; 
Cuestiones relacionadas