Join 3 Tabellen ohne doppelte Ausgabe

HomerJ

Neuer Benutzer
Beiträge
2
Hallo,
ich habe 3 Tabellen mit folgendem Inhalt:
Tabelle A: Country,Code
Tabelle B: Lake, Code
Tabelle C: Mountain, Code

Ziel ist es die 3 Tabellen zu joinen und als Ergebnis eine Tabelle zu erhalten, welche jedem Land alle Seen und Berge zuordnet.
Ich habe dies versucht folgendermaßen zu lösen:

select country.name, geo_lake.lake,geo_mountain.mountain from country
Left Outer Join geo_lake on country.code=geo_lake.code
Left Outer Join geo_mountain on country.code=geo_mountain.code
order by country.name

Problematisch wird es beispielsweise wenn einem Land 3 Berge aber nur 2 Seen zugeordnet werden. Die Select Abfrage liefert in diesem Fall:
Land A, Berg1, See1
Land A, Berg2, See2
Land A, Berg3, See1

Was muss ich ändern damit in der 3. Zeile "null" anstatt See1 als Ausgabe erscheint?
 
Werbung:
Was muss ich ändern damit in der 3. Zeile "null" anstatt See1 als Ausgabe erscheint?

das ist doch auch Murks, oder?

Was ist das Feld 'code' denn? Hat jedes Land einen, und das ist dann jeweils auch die Verbindung zu den anderen Tabellen?

Code:
test=*# select * from country ;
  name  | code
--------+------
 Land A |    1
(1 row)

test=*# select * from lake ;
  name  | code
--------+------
 Lake 1 |    1
 Lake 2 |    1
(2 rows)

test=*# select * from mountain ;
  name  | code
--------+------
 Berg 1 |    1
 Berg 2 |    1
 Berg 3 |    1
(3 rows)

test=*# select c.name land, l.name see, m.name berg from country c left join lake l on c.code=l.code left join mountain m on c.code=m.code;
  land  |  see   |  berg  
--------+--------+--------
 Land A | Lake 1 | Berg 1
 Land A | Lake 2 | Berg 1
 Land A | Lake 1 | Berg 2
 Land A | Lake 2 | Berg 2
 Land A | Lake 1 | Berg 3
 Land A | Lake 2 | Berg 3
(6 rows)
 
Jedes Land hat ein spezifischen Code und jeder Fluss bzw Berg ist einem spezifischen Code (Ländercode) zugeordnet.
Aktuell sieht meine Tabelle folgendermaßen aus:

LandA|BergA|SeeA
LandA|BergB|SeeB
LandA|BergC|SeeA
LandB|BergD|SeeC
...
...
...

Nun hätte ich gerne als Ausgabe:
LandA|BergA|SeeA
LandA|BergB|SeeB
LandA|BergC|Null
LandB|BergD|SeeC
 
Werbung:
Was muss ich ändern damit in der 3. Zeile "null" anstatt See1 als Ausgabe erscheint?

Ja, die spannende Frage ist nun: warum soll das NULL bei der Zeile mit Berg 3 sein, und nicht bei Berg 1 oder 2?

Code:
test=*# select country.name, lake.name,mountain.name from country
Left Outer Join lake on country.code=lake.code
Left Outer Join mountain on country.code=mountain.code
order by country.name;
  name  |  name  |  name  
--------+--------+--------
 Land A | Lake 1 | Berg 1
 Land A | Lake 2 | Berg 1
 Land A | Lake 1 | Berg 2
 Land A | Lake 2 | Berg 2
 Land A | Lake 1 | Berg 3
 Land A | Lake 2 | Berg 3
(6 rows)

test=*#

IMHO ein korrektes Ergebniss, oder?
 
Zurück
Oben