Bei einem einfachen Fremdschlüssel würde ich einfach was in der art “SELECT id,forkey FROM tabelle_A ta LEFT JOIN tabelle_B tb ON ta.forkey = tb.id” schreiben. Wie ich diese Ersetzung allerdings angehe, wenn ich ein Array aus Fremdschlüsseln vorliegen habe erschließt sich mir nun leider trotz ausführlicher Konsultation der Dokumentation nicht.
Ich möchte also gerne nach einen select * auf die DB-View “1 | {“ABC”,“CDE”,“EFG”}” zurück erhalten.
Das Workaround es via Skript mit einzelnen DB-Abfragen in einer Schleife aufzulösen ist wie zu erwarten war nicht performant genug.
Wenn mir da jemand weiterhelfen könnte, wäre ich dankbar. (Ich bin überzeugt dass es geht, ich finde es nur nicht)
Normalisiere den Quark. Das, was Du ‘forkey’ bezeichnest und Foreign Key meinst ist kein solcher, da die DB das nicht sicherstellen kann.
Bis dahin nutze das als Würgaround:
test=*# select * from a;
id | forkey
----+---------
1 | {1,3,4}
(1 row)
Time: 0,185 ms
test=*# select * from b;
id | value
----+-------
1 | ABC
2 | BCD
3 | CDE
4 | EFG
(4 rows)
Time: 0,105 ms
test=*# select x.id,array_agg(b.value) as values from (select id, unnest(forkey) as forkey from a) x left joinb on x.forkey=b.id group by 1;
id | values
----+---------------
1 | {ABC,CDE,EFG}
(1 row)
Dass das keine echten Fremdschlüssel sind ist mir klar, nur schien mir das noch die sinnvollste Beschreibung für die Spalte.
Bei bestehenden Strukturen kann man leider nicht immer ohne weiteres korrigierenden eingreifen, daher muss ich mit diesem Altbestand leben.
Aber vielen Dank für deinen Gedankenanstoß, das kann ich nun problemlos auf mein Problem skalieren