Update mit Unterabfrage, die mehrere Spalten zurückliefert

Hallo,

ich bin schon häufiger über eine wahrscheinlich eher leichte Frage gestolpert, auf die ich trotz Suche hier im Forum noch keine Antwort recherchieren konnte, deshalb wäre ich Euch für einen Tip dankbar.

Es gibt eine Tabelle, z.B.
accounts (PKEY account_id, INTEGER i1, INTEGER i2)

Nun habe ich ein Zwischenergebnis mit einer SELECT-Abfrage generiert, das so aussieht:
(account_id, anzahl1, anzahl2)

Jetzt möchte ich für alle matchenden account_ids sowohl i1 = anzahl1 und i2 = anzahl2 setzen, nur leider bringe ich das nicht korrekt in der Unterabfrage hin. In meinem Fall sind das noch erheblich mehr Spalten, die ich hier zuweisen möchte.

UPDATE accounts SET 
i1 = anzahl1, 
i2 = anzahl2 
WHERE account_id = (SELECT account_id, anzahl1, anzahl2 FROM xyz)

Passt natürlich in der WHERE-Klausel so nicht, aber könnt ihr euch vorstellen, was ich meine?

Ich möchte auch gerne das Zwischenergebnis nur einmal berechnen, weil die Zischenresultsets (hier das SELECT auf xyz) sehr groß und aufwändig zu berechnen sind. Also am Besten auch nicht mit mehreren Subselects wie hier:

UPDATE accounts a SET 
i1 = (SELECT anzahl1 FROM xyz WHERE xyz.account_id = a.account_id), 
i2 = (SELECT anzahl2 FROM xyz WHERE xyz.account_id = a.account_id)

Habt ihr eine Idee?

Danke für euren Input,
az_hf0



test=# create table a (id int, a int, b int);
CREATE TABLE
test=# copy a from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1    0       0
>> 2    0       0
>> 3    0       0
>> \.
test=# commit;
WARNING:  there is no transaction in progress
COMMIT
test=# update a set a=foo.a, b=foo.b from (select 1 as id, 2 as a, 3 as b) foo where a.id=foo.id;
UPDATE 1
test=# select * from a;
 id | a | b
----+---+---
  2 | 0 | 0
  3 | 0 | 0
  1 | 2 | 3
(3 rows)

Prinzip erkannt? Du machst quasi einen JOIN.

Andreas

Danke, Andreas.

Genau das habe ich gesucht.