Franz. Z.: Joins für Fortgeschrittene

Hi,

lese gerade die Seite von Vinzens Mai

http://aktuell.de.selfhtml.org/artikel/datenbanken/fortgeschrittene-joins/mehrfachjoin1.htm

Und da versteh ich was nicht:

SELECT
  KK1.KndNr,
  Vorname,
  Nachname,
  Strasse,
  PLZ,
  Ort
FROM (Kreditkarten AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr)
INNER JOIN Kunden
ON KK1.KndNr = Kunden.KndNr
WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'

soll die Anforderung "Nun möchte die Marketingabteilung wissen, um welche Person es sich handelt, d.h. Vorname, Nachname, Anschrift, … " erfüllen.

Aber reicht da nicht auch:

SELECT
  KK1.KndNr,
  Vorname,
  Nachname,
  Strasse,
  PLZ,
  Ort
FROM Kreditkarten AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr
WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'

Grüße, Franz

  1. Hello,

    Vorname,
      Nachname,
      Strasse,
      PLZ,
      Ort
    FROM Kreditkarten AS KK1
    INNER JOIN Kreditkarten AS KK2

    wo sollen denn die Daten herkommen? In der Kreditkartentabelle stehen sie nicht!
    Wenn du stattdessen Kreditkarten INNER JOIN Kunden meintest, dann fehlt dir wiederum das sowohl als auch bei den Kreditkarteninstituten...

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    He is entertaining both out of the car and in the car because if you tell him that a corner is almost flat then he is the guy who is going to try to take it flat even if it means shunting it the other side of it, he will come with the data and say 'hey, I may have crashed and destroyed the car, but I was flat-out'. That is an interesting quality that he has!  --  Team Member on Jacques Villeneuve
  2. Hallo Franz,

    Und da versteh ich was nicht:

    SELECT
      KK1.KndNr,
      Vorname,
      Nachname,
      Strasse,
      PLZ,
      Ort
    FROM (Kreditkarten AS KK1
    INNER JOIN Kreditkarten AS KK2
    ON KK1.KndNr = KK2.KndNr)
    INNER JOIN Kunden
    ON KK1.KndNr = Kunden.KndNr
    WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'

    soll die Anforderung "Nun möchte die Marketingabteilung wissen, um welche Person es sich handelt, d.h. Vorname, Nachname, Anschrift, … " erfüllen.

    in der Erläuterung könnte ich ergänzen, dass sich diese Angaben in der Tabelle Kunden befinden. Ich ging davon aus, dass dies aus dem Abschnitt Beispieldatenbank hervorginge.

    Freundliche Grüße

    Vinzenz

    1. in der Erläuterung könnte ich ergänzen, dass sich diese Angaben in der Tabelle Kunden befinden. Ich ging davon aus, dass dies aus dem Abschnitt Beispieldatenbank hervorginge.

      Hallo Vinzenz,

      nein, nein. Die Erläuterung ist völlig ausreichend und ich geh auch davon aus, dass die Infos in der Kundentabelle stehen.

      Meine Query ist nicht ganz richtig. Ich frag nochmal neu:

      Würde diese Query nicht dasselbe Resultat bringen wie Dein Mherfachjoin?

        
        
      SELECT  
        KK1.KndNr,  
        KK1.Firma,  
        KK1.Vorname,  
        KK1.Nachname,  
        KK1.Strasse,  
        KK1.PLZ,  
        KK1.Ort  
      FROM Kunden AS KK1  
      INNER JOIN Kreditkarten AS KK2  
      ON KK1.KndNr = KK2.KndNr  
      WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'  
      
      

      Grüße, Franz

      1. Hello,

        Würde diese Query nicht dasselbe Resultat bringen wie Dein Mherfachjoin?

        Nein, und zwar weil...

        SELECT
        FROM Kunden AS KK1
        INNER JOIN Kreditkarten AS KK2
        ON KK1.KndNr = KK2.KndNr
        WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'

        KK1 nun die Kundentabelle ist - sie kennt keine Firma, sie weiß nicht was ein "Mastercard ist".  
          
        Um dir direkt die dritte Alternative wegzunehmen:  
          
        
        > ~~~sql
          
        
        > SELECT  
        > FROM Kunden AS KK1  
        > INNER JOIN Kreditkarten AS KK2  
        > ON KK1.KndNr = KK2.KndNr  
        > WHERE KK2.Firma = 'Mastercard' AND KK2.Firma = 'American Express'  
        > 
        
        

        bringt auch nicht das richtige Ergebnis, weil in der Spalte "Firma" niemals sowohl der Wert Mastercard als auch der Wert American Express stehen kann.

        Um dir direkt die vierte Alternative wegzunehmen:

        SELECT
        FROM Kunden AS KK1
        INNER JOIN Kreditkarten AS KK2
        ON KK1.KndNr = KK2.KndNr
        WHERE KK2.Firma = 'Mastercard' OR KK2.Firma = 'American Express'

        bringt auch nicht das richtige Ergebnis, weil hier zwar korrekt überprüft wird, ob der Kunde eine Mastercard ODER eine American Express hat, es jetzt aber keine (direkte) Möglichkeit mehr gibt herauszufinden, ob der Kunde BEIDE Karten hat (was ja gefordert war).  
          
        MfG  
        Rouven  
        
        -- 
        \-------------------  
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& ([SelfCode](http://selfspezial.atomic-eggs.com/scode/selfcode.php?encodieren))  
          
        Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities  --  Wisdom on Wallstreet