Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Join 3 Tabellen ohne doppelte Ausgabe

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von HomerJ, 5 Mai 2020.

  1. HomerJ

    HomerJ Neuer Benutzer

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
  3. HomerJ

    HomerJ Neuer Benutzer

    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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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?
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden