2012-06-07 13 views
6

È la sintassi corretta per un aggiornamento Informix?aggiornamento tabella Informix con join

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

ottengo il generico -201 'un errore di sintassi si è verificato' un messaggio, ma non riesco a vedere che cosa c'è che non va.

+0

La sintassi mostrata manca un gran numero di e parole chiave. –

risposta

6

tuo errore di sintassi è table1.code

set table1.code = 100 

cambiamento in questo

set a.code = 100 

codice completa

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

ciao, ho una query di aggiornamento/join simulare, ma piuttosto che impostare il valore a.code sul valore statico di 100, ho bisogno di fare riferimento a un valore di colonna su una tabella di join. Ho provato 'table3.key' e 'c.key' ma senza fortuna. – emeraldjava

+0

@emeraldjava pubblica il tuo codice per aiutarti. – Esen

+0

Sfortunatamente, questo causa un errore di sintassi in Informix 11.50. (Per ottenere la versione del server Informix, esegui SQL 'seleziona prima 1 dbinfo (" versione "," completa ") da systables;') – Rockallite

3

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

Trova questa pagina nei documenti XPS mentre cerchi una soluzione, quindi sembra che la tua ipotesi fosse giusta . http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqlt.doc/sqltmst150.htm – Frosty840

+0

Purtroppo il link nella risposta di @ Frosty840 era 404 'non trovato 'quando controllato il 2017-11-09. –

5

Purtroppo, la risposta accettata causa errore di sintassi nella Informix Dynamic Server versione 11.50.

Questo è l'unico modo per evitare errore di sintassi:

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

BTW, a get Informix version, eseguire il seguente SQL:

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

Lo stesso vale per la versione 11.70 – axxis

+0

Lo stesso vale per la versione 11.10 – MPaul

0

Per Informix SE 7.25 ...

  1. AGGIORNAMENTO ... DA ...sintassi non esiste
  2. Inoltre, "Non è possibile modificare la tabella o vista utilizzati in subquery" che è dato quando si utilizza Rockallite's answer

Un'altra soluzione potrebbe essere quella di una scomposizione in due query:

In primo luogo, ottenere i ROWIDs per i record richiesti (filtrati su più tavoli):

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

Mettere il risultato in una stringa separati da virgola.

Quindi, aggiornare solo i record per la tabella principale dove il ROWID è stato trovato nella prima query:

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

Dipende dalla versione utilizzata. Se si utilizza almeno 11,50 la soluzione migliore sarebbe:

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

L'AGGIORNAMENTO - SET - DA - sintassi è stata rimossa nelle versioni superiori a 11.50.

Se si utilizza una versione precedente si può andare con

UPDATE t SET a = t2.a FROM t, t2 WHERE t.b = t2.b; 
Problemi correlati