it-swarm.com.de

Aktualisieren Sie eine Spalte einer Tabelle mit einer Spalte einer anderen Tabelle in PostgreSQL

Ich möchte alle Werte aus einer Spalte val1 einer Tabelle table1 in eine Spalte val2 einer anderen Tabelle table2 kopieren. Ich habe diesen Befehl in PostgreSQL ausprobiert:

update table2
set val2 = (select val1 from table1)

Aber ich habe diesen Fehler bekommen:

ERROR: mehr als eine Zeile, die von einer als Ausdruck verwendeten Unterabfrage zurückgegeben wird

Gibt es eine Alternative, das zu tun?

22
f.ashouri

Ihre UPDATE Abfrage sollte wirklich so aussehen:

UPDATE table2 t2
SET    val2 = t1.val1
FROM   table1 t1
WHERE  t2.table2_id = t1.table2_id
AND    t2.val2 IS DISTINCT FROM t1.val1  -- optional, to avoid empty updates

So wie Sie es hatten, gab es keine Verbindung zwischen den einzelnen Zeilen der beiden Tabellen. Jede Zeile würde von table1 für jede Zeile in table2 abgerufen. Dies machte keinen Sinn (teuer) und löste auch den Syntaxfehler aus, da ein Unterabfrage-Ausdruck an dieser Stelle nur einen einzelnen Wert zurückgeben darf.

  • Ich habe das Problem behoben, indem ich die beiden Tabellen in table2_id zusammengefügt habe. Ersetzen Sie das durch was auch immer die beiden verbindet.

  • Ich änderte die UPDATE neu, um table1 (mit der FROM-Klausel) beizutreten, anstatt korrelierte Unterabfragen auszuführen, da dies regelmäßig um eine Größenordnung schneller ist.
    .__ Es verhindert auch, dass table2.val2 für ungültig erklärt wird, wenn in table1 keine übereinstimmende Zeile gefunden wird. Stattdessen passiert nothing solchen Zeilen in dieser Form der Abfrage.

  • Sie können in die Liste FROM dasselbe einschließen, die Sie in eine einfache Variable SELECT aufnehmen könnten (wie mehrere Tabellen oder Unterabfragen). Pro Dokumentation:

from_list

Eine Liste von Tabellenausdrücken, die Spalten aus anderen Tabellen in erscheinen in der WHERE-Bedingung und den Aktualisierungsausdrücken. Das ist ähnlich der Liste der Tabellen, die in der FROM-Klausel .__ angegeben werden können. einer SELECT-Anweisung. Beachten Sie, dass die Zieltabelle nicht in .__ angezeigt werden darf. from_list, es sei denn, Sie beabsichtigen einen Self-Join (in diesem Fall muss mit einem Alias ​​in from_list) erscheinen.

  • Die abschließende WHERE-Klausel verhindert Updates, die nichts ändern würden - was praktisch immer eine gute Idee ist (volle Kosten, aber kein Gewinn - es gelten exotische Ausnahmen).
52

update table1 set table1_column = table2.column aus table2 table2 wobei table1_id = table2.id ist 

  1. verwenden Sie keinen Aliasnamen für table1.
  2. tabellen sind table1, table2 
0
Bharath Pateru