2017-02-14 9 views
0

Ich habe das Problem, mehrere Spalten (2) in mehreren Zeilen (7) von einer Subselect-Abfrage zu aktualisieren. HierSQL Update mehrere Zeilen und Spalten mit Subselect-Abfrage

ist das, was ich bisher:

UPDATE commandtbl2 t1 
SET (attr, attr2) = (
SELECT attr, attr2 
FROM commandtbl3 t2 
WHERE t1.cmd=t2.cmd 
); 

Allerdings, wenn ich diesen Lauf lasse ich bekommen SQLCODE = -811, SQLSTATE = 21000

(DAS ERGEBNIS EINER EINGEBETTETE SELECT-Anweisung oder einen subselect IN DER SET-KLAUSEL EINER AKTUALISIERUNGSERKLÄRUNG IST EINE TABELLE VON MEHR ALS EINER REIHE, ODER DAS ERGEBNIS EINER UNTERNAHME EINER GRUNDPRÄDIKATION IST MEHR ALS EIN WERT.

Wo ist mein Fehler? Es sollte die 2 Spalten in 3 Zeilen ändern und die anderen Zeilen so belassen wie sie sind. Ich kann nur SQL verwenden, also kein Java, PHP und so weiter.

Da es sich um DB2 Lösungen, die ich gefunden haben online wie:

UPDATE commandtbl2 t1 
SET attr = t2.attr, attr2=t2.attr2 
FROM commandtbl2 t1 
JOIN commandtbl3 t2 
ON t1.cmd = t2.cmd ; 

Oder

UPDATE 
commandtbl2 t1 
JOIN 
commandtbl3 t2 ON t1.cmd=t2.cmd 
SET 
t1.attr = t2.attr, 
t1.attr2=t2.attr2; 

nicht funktionieren aber Ausnahmen werfen.

Danke für Ihre Hilfe.

TheVagabond

+0

Mögliche Duplikat [Update-Abfrage SQL Joins] (http://stackoverflow.com/questions/982919/sql-update-query-using-joins) – HoneyBadger

+1

Die Fehlermeldung ist ziemlich klar - Sie Reihen auf ein Update Zeit, so dass der Subselect unter den von Ihnen angegebenen Bedingungen eine einzelne Zeile zurückgeben muss. Finden Sie einen Weg, Zeilen in 'commandtbl3' eindeutig zu identifizieren – mustaccio

+0

Wie viele Zeilen in commandtb2 und commandtbl3? Es scheint, dass Sie nur wenige haben, also können Sie die Zeilen in Ihre Frage bearbeiten, damit wir ihre Werte sehen können? – user2338816

Antwort

-1

Verwenden Sie einen Join:

UPDATE commandtbl2 t1 JOIN commandtbl3 t2 ON t1.cmd=t2.cmd SET t1.attr=t2.attr, t1.attr2=t2.attr2; 

Problem wahrscheinlich ist wie gesagt, versuchen Sie eine Zeile (oder mehr) mit den Werten von mehr Zeilen zu aktualisieren.

+0

Ich bekomme SQLCODE = -104, SQLSTATE = 42601 und es sagt mir, dass eine FROM fehlt, bevor der JOIN – Thevagabond

-1

Ich denke, Ihre erste Version sollte funktionieren. Aber hier ist eine andere Idee:

UPDATE commandtbl2 
    SET attr = t2.attr, attr2 = t2.attr2 
    FROM commandtbl3 t2 
    WHERE commandtbl2.cmd = t2.cmd ; 

Die Version von DB2 zählt. In V10, müssen Sie zwei Unterabfragen:

UPDATE commandtbl2 
    SET attr = (SELECT t2.attr FROM commandtbl3 t2 WHERE commandtbl2.cmd = t2.cmd FETCH FIRST 1 ROW ONLY), 
     attr2 = (SELECT t2.attr2 FROM commandtbl3 t2 WHERE commandtbl2.cmd = t2.cmd FETCH FIRST 1 ROW ONLY); 

Hinweis: Normalerweise, wenn FETCH FIRST 1 ROW ONLY verwenden, würden Sie einen ORDER BY haben.

+0

t2.attr in diesem Zusammenhang ungültig ist. SQLCODE = -206, SQLSTATE = 42703 – Thevagabond

+0

Sind Sie sicher, dass Sie DB2 verwenden? –

+0

DB2 v10.5 Windows. – Thevagabond

Verwandte Themen