Die Frage ist alt, aber ich hatte das Gefühl, dass die beste Antwort noch nicht gegeben wurde.
Gibt es eine UPDATE
Syntax ... ohne Angabe der Spaltennamen ?
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. Eine DO
Anweisung mit PL / pgSQL- Code, der dynamisches SQL ausführt, ist jedoch keine PostgreSQL-Syntax.
DO
$do$
BEGIN
EXECUTE (
SELECT
'UPDATE b
SET (' || string_agg( quote_ident(column_name), ',') || ')
= (' || string_agg('a.' || quote_ident(column_name), ',') || ')
FROM a
WHERE b.id = 123
AND a.id = b.id'
FROM information_schema.columns
WHERE table_name = 'a' -- table name, case sensitive
AND table_schema = 'public' -- schema name, case sensitive
AND column_name <> 'id' -- all columns except id
);
END
$do$;
Angenommen, b
für jede Spalte eine passende Spalte a
, 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.
UPDATE b
SET ( column1, column2, column3)
= (a.column1, a.column2, a.column3)
FROM a
WHERE b.id = 123 -- optional, to update only selected row
AND a.id = b.id;
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 sind NOT NULL
(aber nicht unbedingt B
),
und Sie kennen die Spaltennamen von B
(aber nicht unbedingt A
).
UPDATE b
SET (column1, column2, column3, column4)
= (COALESCE(ab.column1, b.column1)
, COALESCE(ab.column2, b.column2)
, COALESCE(ab.column3, b.column3)
, COALESCE(ab.column4, b.column4)
)
FROM (
SELECT *
FROM a
NATURAL LEFT JOIN b -- append missing columns
WHERE b.id IS NULL -- only if anything actually changes
AND a.id = 123 -- optional, to update only selected row
) ab
WHERE b.id = ab.id;
Der NATURAL LEFT JOIN
verbindet eine Zeile, aus der b
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. Daher A
ist es nur dann zuverlässig, wenn alle Spalten in A
definiert sind NOT NULL
.
Es gibt mehrere mögliche Variationen, je nachdem, was Sie über beide Tabellen wissen .