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

Zu blöd für nen outer join?

Dieses Thema im Forum "Oracle" wurde erstellt von gurbelunder, 1 Dezember 2014.

  1. gurbelunder

    gurbelunder Datenbank-Guru

    Moin Jungs,

    ich glaube, das Wochenende ist bei mir noch nicht ganz vorbei. Ich bin gerade irgendwie zu blöd für einen Outer Join.

    Folgende Problemstellung: Zwei Tabellen, eine mit Datensätzen zu Personen und dem Raum, in dem sie sitzen. Die zweite mit den Details zu den Räumen.

    Mal Grob skizziert:

    T_PERSON:
    • P_ID
    • Vorname
    • Nachname
    • R_ID (FK zur T_RAUM)
    T_RAUM:
    • R_ID
    • Raum (die eigentliche Raumnummer)
    • Standort
    Nun gibt es Freelancer, denen kein Raum im Gebäude zugewiesen ist, das heißt, die R_ID Spalte in der T_PERSON ist NULL.

    Mein Versuch:

    Code:
    select p.Vorname, p.Name, r.Raum as "Raumnummer"
    from T_PERSON p left outer join T_RAUM r
    on p.Raum_ID = r.ID
    order by p.Vorname, p.Name, r.Raum;
    
    Code:
    select p.Vorname, p.Name, r.Raum as "Raumnummer"
    from T_PERSON p left outer join T_RAUM r
    on p.Raum_ID = r.ID
    order by p.Vorname, p.Name, r.Raum;
    
    Verstehe ich gerade nen Outer Join verkehrt?

    Danke euch und Grüße,
    David
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Beide selects sehen auf den ersten Blick gleich und in Ordnung aus. Was bekommst Du, was erwartest Du?
     
  3. Distrilec

    Distrilec Datenbank-Guru

    Wo genau liegt denn das Problem ?
    Ich kann nicht sagen ob es richtig oder falsch ist wenn ich keine Ausgangsdaten und die daraus resultierenden Ergebnisse sehe... :)
    Ansonsten versuchs mal so:


    Code:
    Select p.vorname,
           p.name,
           r.raum As "Raumnummer"
    From   t_person p
    Left  Join t_raum r
    On     p.raum_id = r.id
    
    Union All
    
    Select p.vorname,
           p.name,
           p.raum
    From   t_person p
    Where  p.raum Is Null
    
    Order  By p.vorname, p.name, r.raum;
     
  4. gurbelunder

    gurbelunder Datenbank-Guru

    Hehe, ihr seit lustig, ich gebe ja nun nicht meine produktiven Daten raus ;). Aber mal beispielhaft:

    Nehmen wir an, in der Tabelle T_PERSON gäbe es diese Datensätze:
    • Mario Müller, Raum 5
    • Kerstin Mustermann, kein Raum

    In der Tabelle T_RAUM dann diese:
    • Raum 5, Standort Berlin
    • Raum 10, Standort Köln
    Meine Abfrage liefert mir dann nur den Datensatz mit Mario Müller...

    Sprich mir fehlen die Personen, denen kein Raum zugewiesen ist. Einen Union wollte ich eigentlich vermeiden, dass sollte ja mit dem Join machbar sein. Das Ganze soll später mit noch mehr Infos in eine View.

    EDIT: Ok, nun hab ich's, es passte was mit dem Schlüsselwert nicht, der war korrupt. War auf den ersten Blick nicht zu sehen. Also doch nicht zu blöd. Danke euch!!!
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Dein Elend ist uns schnuppe ;-)


     
  6. gurbelunder

    gurbelunder Datenbank-Guru

    War mir schon klar :D

    Aber zur Syntax: Also Oracle ist da mittlerweile offener geworden. Die neue (ich glaube ANSI) Schreibweise wird auch unterstützt. Aber auch schon seit 10g oder 11g...
     
  7. Distrilec

    Distrilec Datenbank-Guru

    Die ANSI-Schreibweise erlaubt aber auch sowas:
    Code:
    Select *
    From tabelle_a
    Join tabelle_b
    Join tabelle_c
    ... (Könnte man ewig so weiterführen)
    On tabelle_a.id = tabelle_b.id
    On tabelle_b.ref_id = tabelle_c.id
    ... (Könnte man ewig so weiterführen)
    Was ich persönlich einfach nur unleserlich finde...


    Edit:

    Man kann es sogar umdrehen:
    Code:
    Select *
    From tabelle_a
    On tabelle_a.id = tabelle_b.id
    On tabelle_b.ref_id = tabelle_c.id
    ... (Könnte man ewig so weiterführen)
    Join tabelle_b
    Join tabelle_c
    ... (Könnte man ewig so weiterführen)
    
     
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