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

Frage zum Left Outer Join

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von markus29, 5 Mai 2014.

  1. markus29

    markus29 Neuer Benutzer

    Hallo Leute,

    ich habe ein SQL-Problem, bei dem Ihr mir vielleicht helfen könnt :)

    Folgende Konstellation:

    mis_markt_belegung -> mis_vorgang_pos (1:1)
    mis_vorgang_pos -> mis_rechnung_pos (1:n), mis_rechnung_pos muss nicht gefüllt sein
    mis_rechnung_pos -> mis_rechnung_kopf (n:1), mis_rechnung_kopf ist immer gefüllt
    mis_rechnung_kopf -> mis_rechnung_summen (1:1), mis_rechnung_summen ist immer gefüllt
    mis_rechnung_kopf -> auswahlfeld_rechnungsstatus (1:1), auswahlfeld_rechnungsstatus ist immer gefüllt
    mis_rechnung_kopf -> auswahlfeld_bankbeleg (1:1), auswahlfeld_bankbelegmuss nicht gefüllt sein

    SQL-Statement:

    SELECT *
    FROM mis_markt_belegung
    INNER JOIN mis_vorgang_pos ON mis_markt_belegung.vorgang_pos_key = mis_vorgang_pos.vorgang_pos_key
    AND mis_vorgang_pos.geloescht = 0
    LEFT OUTER JOIN mis_rechnung_pos ON mis_vorgang_pos.vorgang_pos_key = mis_rechnung_pos.vorgang_pos_key
    AND mis_rechnung_pos.geloescht = 0
    INNER JOIN mis_rechnung_kopf ON mis_rechnung_pos.rechnung_key = mis_rechnung_kopf.rechnung_key
    AND mis_rechnung_pos.geloescht = 0
    INNER JOIN mis_rechnung_summen ON mis_rechnung_pos.rechnung_key = mis_rechnung_summen.rechnung_key
    AND mis_rechnung_summen.ist_hauswaehrung = 1
    AND mis_rechnung_summen.geloescht = 0
    INNER JOIN mis_auswahlfelder_pos auswahlfeld_rechnungsstatus ON mis_rechnung_kopf.status = auswahlfeld_rechnungsstatus.auswahlfeld_pos_key
    AND auswahlfeld_rechnungsstatus.kuerzel != '999'
    AND auswahlfeld_rechnungsstatus.geloescht = 0
    LEFT OUTER JOIN mis_auswahlfelder_pos auswahlfeld_bankbeleg ON mis_rechnung_kopf.bankbeleg = auswahlfeld_bankbeleg.auswahlfeld_pos_key
    AND auswahlfeld_bankbeleg.geloescht = 0
    WHERE mis_markt_belegung.markt_key = 27
    AND mis_markt_belegung.geloescht = 0


    Wenn zu einem Datensatz in der Tabelle mis_vorgang_pos kein entsprechender Datensatz in der Tabelle mis_rechnung_pos vorhanden ist, bekomme ich ein leeres Ergebnis. Warum funktioniert der
    LEFT OUTER JOIN mis_rechnung_pos ON mis_vorgang_pos.vorgang_pos_key = mis_rechnung_pos.vorgang_pos_key in diesem Fall nicht?


    Vielen Danke :)

    LG Markus
     
  2. akretschmer

    akretschmer Datenbank-Guru


    Auf die Schnelle sehe ich keinen Fehler. Probier die Abfrage schrittweise aus. Bin jetzt zu müde, mir das genauer anzusehen.
     
  3. Hony%

    Hony% Datenbank-Guru

    Ich würde ja eine Fehlermeldung erwarten...
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ähm, warum? Er setzt ja nur einen Alias, soweit ich das parse.
     
  5. Hony%

    Hony% Datenbank-Guru

    Stimmt, kurze Notation. Da hat mich wohl der Wurm überrannt.

    Die Selektion der Daten gehört aber definitiv in eine WHERE Klausel und nicht in den JOIN. So wird letztendlich ein INNER JOIN erzwungen.
     
    ukulele gefällt das.
  6. markus29

    markus29 Neuer Benutzer

    Dann liegt es vermutlich daran :)

    D. h. immer wenn ich einen LEFT OUTER / RIGHT OUTER verwende muss die Selektion dieser in die Where-Klausel und nicht in den Join?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    In den JOIN immer die Join-Condition und in das Where immer die Where-Condition. Kann man sich so sogar merken ;-)
     
  8. ukulele

    ukulele Datenbank-Guru

    Oder Faustregel:
    Die Join-Condition sorgt für mehr zurückgegebene Information, die Einschränkungen der Where-Condition für weniger. :)
     
  9. akretschmer

    akretschmer Datenbank-Guru

    Im Falle des Fragestellers war es aber nicht so *g*
     
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