Ich habe drei Tabellen, aus denen ich mittels left join Daten abfrage.
Das klappt super.
Im Ergebnis habe ich mehrere Spalten mit werten und mehrere spalten mit IDs. Diese IDs sind in einer vierten Tabelle (“Lists”) Namen zugeordnet. Diese Namen möchte ich nun anstelle der Ids in meiner Ergebnistabelle stehen haben.
Das Problem dabei ist, daß in der Lists-Tabelle die IDs mehrmals vorkommen und die in der Ergebnistabelle gwünschten namen nur über die Kombination von zwei spaltennamen aus der Tabelle Lists abgefragt werden können.
Um zu erläutern: Die einzeln dargestellte Abfrage der Namen aus der Tabelle Lists sieht so aus:
select distinct lists.val1 as einheit from lists,vars where vars.ln_einheit=lists.ln and lists.key=‘ln_einheit’
Das problem ist dass es mehrere solchen Namensspalten in der Ergebnistabelle gibt.
Wenn ich Dich korrekt verstehe, muß Du die Nachschlagetabelle mehrfach joinen. Tue dies einfach, und vergibt pro Join einen eigenständigen Alias-Namen.
test=*# select * from id;
id1 | id2 | id3
-----+-----+-----
1 | 2 | 3
(1 row)
test=*# select * from namen;
id | name | v
----+-------------+---
1 | name1 | 1
2 | name2 | 1
3 | name3 | 1
1 | name1 mit v | 2
2 | name2 mit v | 2
3 | name3 mit v | 2
(6 rows)
test=*# select id1, n1.name, i.id2, n2.name, i.id3, n3.name from id i left join namen n1 on (i.id1=n1.id) left join namen n2 on (i.id2=n2.id) left join namen n3 on (i.id3=n3.id) where n1.v = 2 and n2.v=2 and n3.v=2;
id1 | name | id2 | name | id3 | name
-----+-------------+-----+-------------+-----+-------------
1 | name1 mit v | 2 | name2 mit v | 3 | name3 mit v
(1 row)
danke erstmal, aber das überblick ich noch nicht ganz,
hab nochmal die namen-tabelle so strukturiert wie ich sie hier habe:
test=*# select * from namen;
key | ID | val1
----------±------------±–
id_bl | 1 | bayern
id_bl | 2 | hessen
id_bl | 2 | hessen
id_einh | 1 | meter
id_einh | 1 | meter
id_einh | 2 | kilometer
aus den anderen drei tabellen (data,vars,areas) bekomme ich mittels
select data.value, data.year, vars.name, vars.id_bl, areas.id_einh
from areas
left join data on data.id_area=areas.id
left join vars on vars.id=data.id_var
where …(hier kommen noch ein paar einschränkungen, unwichtig)
ein wie folgt strukturiertes ergebnis
value| year | name | id_bl | id_einh |
-----±------------±--------±------------±--------+
1 | 1983 |strasse | 1 | 2 |
etc…
Gewünscht ist, dasss in den spalten id_bl und id_einh die passeden Bezeichnungen aus namen.val1 stehen.
test=*# select r.*, n.val, m.val from result r left join namen n on (r.id_bl=n.id) left join namen m on (r.id_einh=m.id) where n.key='id_bl' and m.key='id_einh';
value | year | name | id_bl | id_einh | val | val
-------+------+---------+-------+---------+--------+-----------
1 | 1983 | strasse | 1 | 2 | bayern | kilometer
(1 row)
Allerdings wage ich zu sagen, daß Dein Tabellenschema Schrott ist.
Hm , es geht immer noch gar nix hier, deiner Anleitung nach müsste ich ja das erste ergebnis erst in eine neue Tabelle schreiben. Das würde ich gerne vermeiden.
Bez. des Tabellenschemas: Das hat eine externe Firma so angelegt, damit muss ich jetzt leben…
Du mußt halt Deine Abfrage entsprechend anpassen bzw. das als Subselect realisieren. Das überlasse ich Dir mal zur Übung g
Btw.:
test=*# select r.*, n.val as bundesland, m.val as einheit from result r left join namen n on ((r.id_bl,'id_bl')=(n.id,n.key)) left join namen m on ((r.id_einh,'id_einh')=(m.id,m.key)) ;
value | year | name | id_bl | id_einh | bundesland | einheit
-------+------+---------+-------+---------+------------+-----------
1 | 1983 | strasse | 1 | 2 | bayern | kilometer
(1 row)
Bez. des Tabellenschemas: Das hat eine externe Firma so angelegt, damit muss ich jetzt leben…
Nun ja, die Daten in der Namenstabelle, da sind Dubletten drin. Sowas sollte man verhindern. Ansonsten ist das schon okay.
Gelöst!
Wichtig, ist, in den left joins nach dem “on” die vorher gegebenen aliase zu verwenden, und nicht den original-tabellennamen (zumindest in Postgres…)