alex: join unmöglich?

Huhu, folgende konstellation:

2 Tabellen
----------
1. Tabelle (Tab1): ID, Name
2. Tabelle (Tab2): ID, ID1, ID2

Beim SELECT von Tab2 möchte ich gleich die ID1 und ID2 umgewandelt haben in Namen der Tab1

Beispiel:

Tab1:
1|Hugo
2|Bert

Tab2:
1|1|2

SELECT Tab2.ID, Tab1.Name as Name1, Tab1.Name as Name2 WHERE ...

und genau das ist der springende Punkt, ich weiss nicht wie ich die WHERE Klausel logisch aufbauen soll, entweder zeigt er mir nichts an:

WHERE Tab2.ID1=Tab1.ID AND Tab2.ID2=Tab1.ID => EMPTY

oder er zeigt es mir unbrauchbar doppelt:

WHERE Tab2.ID1=Tab1.ID OR Tab2.ID2=Tab1.ID =>
Hugo|Hugo
Bert|Bert

gewünscht ist aber:
Hugo|Bert

jetzt die Frage, kann man das verknüpfen, wenn ja wie?

danke, alex

  1. Hallo alex,

    jetzt die Frage, kann man das verknüpfen, wenn ja wie?

    Ja, kann man. Du musst dem DBMS weismachen, dass es inwirklichkeit 3 Tabellen verknüpft:

    Tab1 (ID) ----> (ID1) Tab2 (ID2) ----> (ID) Tab1

    Das kannst Du machen, indem Du unterschiedliche Aliases für die Tabelle Tab1 definierst und diese mehrfach im Join auftauchen lässt.

    SELECT  
      Tab2.ID,  
      Tab1_1.Name as Name1,  -- Tab1_1 ist der erste Alias für Tab1  
      Tab1_2.Name as Name2   -- Tab1_2 ist der zweite Alias für Tab1  
    FROM  
      Tab2,  
      Tab1 as Tab1_1,        -- hier wird der erste Alias definiert  
      Tab1 as Tab1_2         -- hier wird der zweite Alias definiert  
    WHERE  
      Tab2.ID1 = Tab1_1.ID   -- erste Verknüpfung  
    AND  
      Tab2.ID2 = Tab1_2.ID;  -- zweite Verknüpfung
    

    Damit erhälst Du das gewünschte Ergebnis - vorausgesetzt, ich habe Dich richtig verstanden.

    Viele Grüße,
    Christian

    1. Hallo Christian,

      Ja, kann man. Du musst dem DBMS weismachen, dass es inwirklichkeit 3 Tabellen verknüpft:

      Tab1 (ID) ----> (ID1) Tab2 (ID2) ----> (ID) Tab1

      Das kannst Du machen, indem Du unterschiedliche Aliases für die Tabelle Tab1 definierst und diese mehrfach im Join auftauchen lässt.

      Mit JOIN-Syntax liest sich Dein SQL-Statement einfach schöner :-)

      SELECT  
        Tab2.ID,  
        Tab1_1.Name as Name1,    -- Tab1_1 ist der erste Alias für Tab1  
        Tab1_2.Name as Name2     -- Tab1_2 ist der zweite Alias für Tab1  
      FROM  
         Tab1 Tab1_1             -- hier wird der erste Alias definiert  
      INNER JOIN Tab2  
      ON Tab2.ID1 = Tab1_1.ID    -- erste Verknüpfung  
      INNER JOIN Tab1 Tab1_2     -- hier wird der zweite Alias definiert  
      ON Tab2.ID2 = Tab1_2.ID;   -- zweite Verknüpfung
      

      Freundliche Grüße

      Vinzenz

      Aus Kompatibilitätsgründen zu Oracle habe ich AS zwischen Tabellennamen und Tabellenalias gestrichen.

      1. danke auch dir für die antwort, hab dein CODE aber nicht so schnell hinbekommen, muß ich mir nochmal in ruhe anschauen...

        bin auf jeden fall erstmal etwas schlauer .-)

        grüße
        alex

        Hallo Christian,

        Ja, kann man. Du musst dem DBMS weismachen, dass es inwirklichkeit 3 Tabellen verknüpft:

        Tab1 (ID) ----> (ID1) Tab2 (ID2) ----> (ID) Tab1

        Das kannst Du machen, indem Du unterschiedliche Aliases für die Tabelle Tab1 definierst und diese mehrfach im Join auftauchen lässt.

        Mit JOIN-Syntax liest sich Dein SQL-Statement einfach schöner :-)

        SELECT

        Tab2.ID,
          Tab1_1.Name as Name1,    -- Tab1_1 ist der erste Alias für Tab1
          Tab1_2.Name as Name2     -- Tab1_2 ist der zweite Alias für Tab1
        FROM
           Tab1 Tab1_1             -- hier wird der erste Alias definiert
        INNER JOIN Tab2
        ON Tab2.ID1 = Tab1_1.ID    -- erste Verknüpfung
        INNER JOIN Tab1 Tab1_2     -- hier wird der zweite Alias definiert
        ON Tab2.ID2 = Tab1_2.ID;   -- zweite Verknüpfung

        
        >   
        >   
        > Freundliche Grüße  
        >   
        > Vinzenz  
        >   
        > Aus Kompatibilitätsgründen zu Oracle habe ich AS zwischen Tabellennamen und Tabellenalias gestrichen.  
        > 
        
    2. Suuuuper.

      Die Lösung ist einfach und verständlich. Funzt soweit auch, habs eben getestet. Wußte bisher nicht das man die Aliase auch später in FROM definieren darf .-)

      big thx
      alex