Strece: Frage zu LeftJoin Abfrage

Guten Abend,

ich habe da eine Frage zu einer gewissen LeftJoin Abfrage in MySQL, ich bekomm es einfach nicht hin die passende Ergebnismenge zu bekommen. Also erstmal ein wenig Vorwissen über meine Datenbankstruktur:

Tabelle Position:
Standort | Objekt_1 | Objekt_2 | Objekt_3 | Typ | Bemerkung

Tabelle Verbindungen:
Von_Standort | Von_1 | Von_2 | Von_3 | Nach_Standort | Nach_1 | Nach_2 | Nach_3

Also in der Tabelle "Position" liegen meine Stammdaten, also alle verfügbaren Daten. In der Tabelle Verbindungen werden diese einzelnen Daten miteinandern verknüft, in meinem Fall Switch Verbindungen zu einer Raumdose oder von Switch zu Switch bzw. Raumdose zu Raumdose.

Das ganze verwalte ich mit einem in Java geschriebenen Programm, dort benutze ich verschiedene Joins um die passenden Ergebnismengen zu bekommen. Nun zu meinem Problem. Ich möchte gerne durch einen Left Join alle Daten aus den Spalten Objekt_1 bis Objekt_3 bekommen, die sich noch nicht in der Tabelle Verbindungen befinden (in den Spalten: Von_1 bis Von_3 und Nach_1 bis Nach_3).

Ein Beispiel:
Wenn in der Tabelle Verbindungen folgendes steht:
null;4507;3;4;null;31;C;12
dann möchte ich meiner Ergebnismenge alle Daten aus der Position Tabelle bekommen, außer die oben im Beispiel genannten, da diese schon vergeben sind bzw. belegt.

Mein Ansatz sieht derzeit so aus:
SELECT Position.Objekt_1, Position.Objekt_2, Position.Objekt_3, Verbindungen.Von_1, Verbindungen.Von_2, Verbindungen.Von_3, Verbindungen.Nach_1, Verbindungen.Nach_2, Verbindungen.Nach_3 From Position LEFT JOIN Verbindungen ON Position.Objekt_3 = Verbindungen.Von_3 AND Position.Objekt_3 = Verbindungen.Nach_3 AND Verbindungen.Von_2 = Position.Objekt_2 AND Verbindungen.Nach_2 = Position.Objekt_2 And Position.Objekt_1 = Verbindungen.Von_1 AND Position.Objekt_1 = Verbindungen.Nach_1 Where (Verbindungen.Von_3 is NULL AND Verbindungen.Nach_3 is NULL) AND Position.Objekt_1 = '4507';

Problem daran ist, wenn jetzt z.B. der obere Datensatz folgendermaßen aussieht:
null;31;C;12null;4507;3;4;

Also vertauscht, so bekomme ich als Ergebnismenge immer noch die 4507;3;4, obwohl diese eigentlich belegt ist.

Ich hoffe jemand kann mir dabei helfen.

Mfg,

Strece

  1. Hello,

    davon abgesehen, dass deine Datenstruktur, vielleicht auch nur auf Grund der redundanten Spaltennamen mit Nummern, mir dubios erscheint, mach es dir nicht so schwer und versuch den Left Join. Nimm stattdessen ein IN.

    (1) Selektiere dir alle Objekte
    SELECT standort, objekt_1, objekt_2, objekt_3, typ, bemerkung
    FROM position

    (2.0) Selektiere alle Objekte in vorderer Position
    SELECT von_1, von_2, von_3 FROM verbindungen

    (2.1) Selektiere alle Objekte in hinterer Position
    SELECT nach_1, nach_2, nach_3 FROM verbindungen

    (3) Finde alle Objekte, die nicht in den Positionen stecken*
    SELECT standort, objekt_1, objekt_2, objekt_3, typ, bemerkung
    FROM position p
    WHERE
       NOT EXISTS (SELECT von_1, von_2, von_3 FROM verbindungen von WHERE von.von_1 = p.objekt_1 AND von.von_2 = p.objekt_2 AND von.von_3 = p.objekt_3)
    AND
       NOT EXISTS (SELECT nach_1, nach_2, nach_3 FROM verbindungen nach WHERE nach.nach_1 = p.objekt_1 AND nach.nach_2 = p.objekt_2 AND nach.nach_3 = p.objekt_3)

    * hier findet man alternativ auch noch ne Lösung für UNION, aber ich bin gerade zu faul nachzuschauen wie ich die KLammerung für die korrelierte Unterabfrage setzen müsste...

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Because good guys need a break every once in a while.  --  Morty in "Click" (Columbia Pictures, 2006)