Array aus Fremdschlüsseln auflösen

Guten Tag,

ich stehe vor dem Problem, dass ich in einem Feld ein Array mit mehreren Fremdschlüsseln habe und ich diese Relation auflösen muss.

Vereinfacht die Situation

tabelle_A
id|forkey
1 | {1,3,4}

tabelle_B
id|value
1 | ABC
2 | BCD
3 | CDE
4 | EFG

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)

Andreas

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