Die Frage ist alt, aber ich hatte das Gefühl, dass die beste Antwort noch nicht gegeben wurde.
Gibt es eine UPDATESyntax ... 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 DOAnweisung 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, bfür jede Spalte eine passende Spalte a, aber nicht umgekehrt.bkann 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 Adefiniert 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 JOINverbindet eine Zeile, aus der balle 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.idin der äußeren Abfrage.
db <> hier fummeln
Alte sqlfiddle.
Dies ist Standard-SQL mit Ausnahme der FROMKlausel .
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 Aist es nur dann zuverlässig, wenn alle Spalten in Adefiniert sind NOT NULL.
Es gibt mehrere mögliche Variationen, je nachdem, was Sie über beide Tabellen wissen .