2012-06-07 12 views
6

Czy jest to poprawna składnia aktualizacji Informix?Aktualizacja tabeli Informix z łączeniami

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

Otrzymuję komunikat generyczny -201 "Wystąpił błąd składni", ale nie widzę, co jest nie tak.

+0

Składnia pokazanego brakuje dużej liczby i słowa kluczowe. –

Odpowiedz

6

Twój błąd składni jest table1.code

set table1.code = 100 

zmiana to pod

set a.code = 100 

pełny kod

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

Witam, Mam simular update/join query, ale zamiast ustawiać wartość a.code na wartość statyczną równą 100, muszę odwołać się do wartości kolumny w tabeli sprzężenia. Próbowałem "table3.key" i "c.key", ale bez powodzenia. – emeraldjava

+0

@emeraldjava dodaj swój kod, aby Ci pomóc. – Esen

+0

Niestety, powoduje to błąd składni w Informix 11.50. (Aby uzyskać wersję serwera Informix, uruchom SQL 'wybierz pierwszy 1 dbinfo (" wersja "," pełny ") z systables;') – Rockallite

3

Oryginalny SQL w pytaniu brzmiała:

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

To bezwarunkowo brakuje serii AND słów kluczowych. Przyjęte rozwiązanie identyfikuje również problem w klauzuli SET przy użyciu table1 zamiast jego aliasu a. To może być materialne; Nie mogę tego przetestować (zobacz dyskusję poniżej). Zakładając więc, że aktualizacja dołączyć akceptuje wszystkim poprawione SQL powinien brzmieć:

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

To jest taki sam, jak składni (skorygowane) Akceptowane odpowiedź. Jednak jestem ciekawa, z której wersji Informix korzystasz, która akceptuje składnię FROM (może XPS?). Używam IDS 11.70.FC2 (3 pakiety poprawek za bieżącą wersją 11.70.FC5) w systemie Mac OS X 10.7.4 i nie mogę pobrać instrukcji UPDATE ze składni FROM do pracy. Dalej podręcznik IBM Informix 11.70 Information Center dla UPDATE nie wspomina o tym. Nie jestem pewien, czy to by miało jakąkolwiek różnicę, jeśli używasz ODBC lub JDBC; nie powinno, ale używam ESQL/C, który wysyła SQL niezmieniony na serwer.

Zapis Próbowałem to (+ jest szybka):

+ 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

Znaleziono tę stronę w dokumentach XPS podczas polowania na rozwiązanie, więc wygląda na to, że Twoje zdanie było słuszne . http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqlt.doc/sqltmst150.htm – Frosty840

+0

Niestety, link w odpowiedzi @ Frosty840 to 404 "nie znaleziono "po sprawdzeniu w dniu 2017-11-09. –

5

Niestety, zaakceptowane odpowiedź powoduje błąd składni w Informix Dynamic Server, wersja 11.50.

Jest to jedyny sposób, aby uniknąć błędów składni:

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, aby get Informix version, uruchom następujące SQL:

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

To samo dotyczy wersji 11.70 – axxis

+0

To samo dotyczy wersji 11.10 – MPaul

0

Dla Informix SE 7,25 ...

  1. UPDATE ... FROM ...składnia nie istnieje
  2. też „Nie można zmodyfikować tabelę lub widok używane w podzapytaniu” który został podany podczas korzystania Rockallite's answer

Innym rozwiązaniem byłoby rozbicie go na dwa pytania:

pierwsze, pobierz ROWIDs dla wymaganych rekordów (filtrowanych na wielu tabelach):

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

Umieść wynik w oddzielonym przecinkiem ciągu.

Następnie aktualizuje tylko te rekordy do tabeli głównej, gdzie ROWID stwierdzono w pierwszym zapytaniu:

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

To zależy od wersji używasz. Jeśli używasz przynajmniej 11,50 najlepszym rozwiązaniem byłoby:

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

aktualizację - zestaw - od - Składnia został usunięty w wersji większych niż 11.50.

Jeśli używasz starszej wersji można przejść z

UPDATE t SET a = t2.a FROM t, t2 WHERE t.b = t2.b; 
Powiązane problemy