3 Stimmen

Mehrere Spalten gleichzeitig in Derby aktualisieren

DB2 unterstützt diese Syntax:

UPDATE DEST D SET (AAA,BBB) = (
    SELECT MAX(Z.AAA), MAX(Z.BBB) FROM OTHER O WHERE O.ID = D.ID
)

D.h. ich kann einen Select ausführen, der mehr als eine Spalte zurückgibt, und die Ergebnisse in verschiedene Spalten der Zieltabelle (die zu aktualisierende Tabelle) kopieren.

Derby erlaubt nur die Syntax:

UPDATE table-Name [[AS] correlation-Name]
    SET column-Name = Value
    [ , column-Name = Value} ]*
    [WHERE clause]

was bedeutet, dass ich auf Probleme stoßen kann, wenn ich die Ergebnisse der Auswahl in irgendeiner Weise gruppieren muss. Gibt es eine bessere Lösung, als die Aktualisierung in zwei Anweisungen aufzuteilen oder dies lokal in einer Schleife in Java zu tun (d. h. Millionen von UPDATE-Anweisungen zu übermitteln)?

3voto

Jonathan Leffler Punkte 694013

Vermutlich können Sie dies tun:

UPDATE DEST D
    SET AAA = (SELECT MAX(Z.AAA) FROM OTHER O WHERE O.ID = D.ID),
        BBB = (SELECT MAX(Z.BBB) FROM OTHER O WHERE O.ID = D.ID)

Ich habe nicht gesagt, dass es effizient ist - aber es ist wahrscheinlich effizienter, als die Aktualisierung in zwei Anweisungen aufzuteilen oder sie lokal in einer Schleife durchzuführen.

1 Stimmen

Ich bin vorsichtig mit den Nebenwirkungen; ist es möglich, dass die beiden Anweisungen unterschiedliche Ergebnisse liefern können, wenn die Select-Klausel komplexer ist?

0 Stimmen

Das sollte es nicht, da die Tabelle, aus der Sie auswählen, nicht aktualisiert wird. Ich wäre bereit, einen Fehler zu behaupten, wenn das ein Problem wäre. Sie haben natürlich auch einen Feature Request zu stellen - die Version mit Mehrfachzuweisung sollte funktionieren, denke ich.

0 Stimmen

Es besteht auch eine bescheidene Chance, dass der Optimierer die Gemeinsamkeiten erkennt und die Unterabfragen tatsächlich als eine Operation ausführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X