Ich habe zwei Tabellen:
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
A
wird immer eine Teilmenge von sein B
(dh alle Spalten von A
sind auch in B
).
Ich möchte einen Datensatz mit einem bestimmten ID
In B
mit ihren Daten aus A
für alle Spalten von aktualisieren A
. Dies ID
existiert sowohl in A
als auch B
.
Gibt es eine UPDATE
Syntax oder eine andere Möglichkeit, dies zu tun, ohne die Spaltennamen anzugeben und nur "Alle Spalten von A setzen" zu sagen ?
Ich verwende PostgreSQL, daher wird auch ein bestimmter nicht standardmäßiger Befehl akzeptiert (jedoch nicht bevorzugt).
Antworten:
Sie können die nicht standardmäßige FROM- Klausel verwenden.
quelle
Die Frage ist alt, aber ich hatte das Gefühl, dass die beste Antwort noch nicht gegeben wurde.
Allgemeine Lösung mit dynamischem SQL
Sie müssen keine Spaltennamen kennen, außer einigen eindeutigen Spalten, an denen Sie teilnehmen möchten (
id
im Beispiel). Funktioniert zuverlässig für jeden möglichen Eckfall, den ich mir vorstellen kann.Dies ist spezifisch für PostgreSQL. Ich erstelle dynamischen Code basierend auf dem information_schema , insbesondere der Tabelle
information_schema.columns
, die im SQL-Standard definiert ist und von den meisten wichtigen RDBMS (außer Oracle) verwendet wird. EineDO
Anweisung mit PL / pgSQL- Code, der dynamisches SQL ausführt, ist jedoch keine PostgreSQL-Syntax.Angenommen,
b
für jede Spalte eine passende Spaltea
, aber nicht umgekehrt.b
kann zusätzliche Spalten haben.WHERE b.id = 123
ist optional, um eine ausgewählte Zeile zu aktualisieren.SQL Fiddle.
Verwandte Antworten mit mehr Erklärung:
Teillösungen mit einfachem SQL
Mit Liste der freigegebenen Spalten
Sie müssen noch die Liste der Spaltennamen kennen, die beide Tabellen gemeinsam haben. Mit einer Syntaxverknüpfung zum Aktualisieren mehrerer Spalten - auf jeden Fall kürzer als die anderen bisher vorgeschlagenen Antworten.
SQL Fiddle.
Diese Syntax wurde 2006 mit Postgres 8.2 eingeführt, lange bevor die Frage gestellt wurde. Details im Handbuch.
Verbunden:
Mit Liste der Spalten in
B
Wenn alle Spalten
A
definiert sindNOT NULL
(aber nicht unbedingtB
),und Sie kennen die Spaltennamen von
B
(aber nicht unbedingtA
).Der
NATURAL LEFT JOIN
verbindet eine Zeile, aus derb
alle gleichnamigen Spalten dieselben Werte enthalten. In diesem Fall benötigen wir kein Update (nichts ändert sich) und können diese Zeilen zu Beginn des Prozesses entfernen (WHERE b.id IS NULL
).Wir müssen noch eine passende Zeile finden, also
b.id = ab.id
in der äußeren Abfrage.db <> hier fummeln
Alte sqlfiddle.
Dies ist Standard-SQL mit Ausnahme der
FROM
Klausel .Es funktioniert unabhängig davon, in welcher der Spalten tatsächlich vorhanden ist
A
, aber die Abfrage kann nicht zwischen tatsächlichen NULL-Werten und fehlenden Spalten in unterscheiden. DaherA
ist es nur dann zuverlässig, wenn alle Spalten inA
definiert sindNOT NULL
.Es gibt mehrere mögliche Variationen, je nachdem, was Sie über beide Tabellen wissen .
quelle
SET (column1) = (a.column)
einfügen ( ) Postgres wird es als eine andere Art von Update behandeln und geben und Fehler wie folgt:source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
Ich arbeite seit mehr als zehn Jahren mit der IBM DB2-Datenbank und versuche nun, PostgreSQL zu lernen.
Es funktioniert unter PostgreSQL 9.3.4, aber nicht unter DB2 10.5:
Hinweis: Das Hauptproblem ist die FROM-Ursache, die in DB2 und auch nicht in ANSI SQL nicht unterstützt wird.
Es funktioniert unter DB2 10.5, aber NICHT unter PostgreSQL 9.3.4:
ENDLICH! Es funktioniert sowohl mit PostgreSQL 9.3.4 als auch mit DB2 10.5:
quelle
B
, führt die erste Anweisung nichts aus (die ursprüngliche Zeile bleibt unberührt), während die anderen beiden Spalten mit NULL-Werten überschreiben.Das ist eine große Hilfe. Der Code
funktioniert perfekt.
Beachten Sie, dass Sie eine Klammer "" in benötigen
damit es funktioniert.
quelle
Nicht unbedingt das, was Sie gefragt haben, aber vielleicht hilft die Verwendung der Postgres-Vererbung?
Dadurch wird vermieden, dass B aktualisiert werden muss.
Lesen Sie jedoch unbedingt alle Details .
Andernfalls wird das, wonach Sie fragen, nicht als bewährte Methode angesehen. Dynamische
SELECT * ...
Dinge wie Ansichten mit werden nicht empfohlen (da eine solche leichte Bequemlichkeit mehr Dinge zerstören als helfen kann), und was Sie verlangen, wäre für denUPDATE ... SET
Befehl gleichwertig .quelle
Sie können dazu dynamisches SQL erstellen und ausführen, aber es ist wirklich nicht ideal
quelle
Versuchen Sie Folgendes
BEARBEITET: - Aktualisieren Sie mehr als eine Spalte
quelle
UPDATE
in MySQL funktionieren , ist jedoch für PostgreSQL ungültig.