ich benötige eventl. einen anderen Blickwinkel auf meinen Update-Befehl. Muss ich vielleicht mit Arrays arbeiten? Hier mein Problem:
Tabelle 1:
id; nr; blb; …
1; 1001; 3002034
2; 1001; 3002035
3; 1002; 3002040
4; 1003; 3002042
5; 1001; NULL
6; 1001; 3002034
usw.
Tabelle 2:
tab1_nr; ud1; …
1001; NULL
1002; NULL
1003, NULL
usw.
Jetzt wollte ich die blb in ud1 zusammenfügen (als String deklariert), aber irgendwie trägt er nur das erste Vorkommen von nr ein anstatt wie angegeben als Verkettung. Hier meine Anweisung:
update tabelle2 set ud1=(Case When ud1 is NULL Then x.blb ELSE concat(ud1,‘,’,x.blb) END)
from (
select nr, blb from tabelle1 where blb is not Null
group by nr, blb
) x
where tab1_nr=x.nr
;
In other words, a target row shouldn’t join to more than one row from the other table(s). If it does, then only one of the join rows will be used to update the target row, but which one will be used is not readily predictable.
Das skalare sub-select von frastr sollte funktionieren, ist aber vermutlich recht langsam. Meistens ist es besser die Aggregation nur einmal zu machen:
update tabelle2 t2
set ud1 = t.blbs
from (
select nr, string_agg(blb,',') as blbs
from tabelle1
group by nr
) t
where t.nr = t2.tab1_nr
Das skalare sub-select von frastr sollte funktionieren, ist aber vermutlich recht langsam. Meistens ist es besser die Aggregation nur einmal zu machen:
> update tabelle2 t2
> set ud1 = t.blbs
> from (
> select nr, string_agg(blb,',') as blbs
> from tabelle1
> group by nr
> ) t
> where t.nr = t2.tab1_nr
Super, vielen Dank! Hat funktioniert , bis auf eine kleine Anpassung: ...string_agg(distinct blb, ',') ...
da Werte in blb auch doppelt vorkommen können, ich die aber nur einmal aufgezählt haben möchte!
Der Befehl string_agg war mir bisher nicht bekannt Jetzt bin ich wieder etwas schlauer
Ja, Du hast Recht, sorry.
Updates ohne Where sind mir immer suspect. Auch wenn nichts schief geht, updated man vielleicht (viel) mehr als nötig, wenn alter Wert und neuer Wert gleich sind.