Eddie: Vermutlich triviale SQL-Anfrage

Hallo allerseits,

irgendwie stecke ich fest, keine Ahnung, wie ich folgende Abfrage ausführen soll...

Ich habe zwei Tabellen, "Kunden" und "Lieblingskunden", die jeweils nur das Attribut "eMail" enthalten (ist nur ein Beispiel).
"Kunden" enthält auch alle Lieblingskunden, und eben noch andere :-) ("Kunden" ist also Obermenge von "Lieblingskunden")

Wie kann ich jetzt die E-Mail-Adressen der anderen (also der nicht-Lieblingskunden) rausfinden? Also das Komplement!

Bisher habe ich rumprobiert mit

SELECT DISTINCT k.eMail
FROM kunden k';
WHERE NOT EXISTS (
   SELECT * FROM lieblingskunden l WHERE k.eMail = l.eMail)

Funktioniert aber nicht!

Danke für eure Hilfe,
Eddie

--
Old men and far travelers may lie with authority.
  1. Hallo,

    SELECT DISTINCT k.eMail
    FROM kunden k';
    WHERE NOT EXISTS (
       SELECT * FROM lieblingskunden l WHERE k.eMail = l.eMail)

    Ja, das ist schon ziemlich nahe dran. Du brauchst das identifizierende Kriterium in beiden Tabellen, also die ID oder bei eMail-Adressen vermutlich eben die. Darauf kannst du jetzt mittels exists oder über NOT IN filtern (bin irgendwie mehr der Fan von NOT IN):
    SELECT *
    FROM kunden
    WHERE eMail NOT IN (
       SELECT eMail
       FROM lieblingskunden
    )

    Wobei ich mich ja schon gerade frage, wo der große Unterschied zu deiner Abfrage ist, eigentlich tut sie ziemlich das selbe, nur du hast da ein ' und ein ; zu viel, ist das beabsichtigt? Sonst ist deines nämlich schlichtweg die Variante mit NOT EXISTS.

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. Hallo Eddie

    Ich habe zwei Tabellen, "Kunden" und "Lieblingskunden", die jeweils nur das Attribut "eMail" enthalten (ist nur ein Beispiel).
    "Kunden" enthält auch alle Lieblingskunden, und eben noch andere :-) ("Kunden" ist also Obermenge von "Lieblingskunden")

    Wie kann ich jetzt die E-Mail-Adressen der anderen (also der nicht-Lieblingskunden) rausfinden? Also das Komplement!

    Der LEFT OUTER JOIN in Verbindung mit IS NULL hilft Dir weiter:

      
    SELECT k.eMail  
    FROM kunden k  
    LEFT OUTER JOIN lieblingskunden l  
    ON k.eMail = l.eMail  
    WHERE l.eMail IS NULL  
    
    

    sollte es tun, siehe dazu join-Syntax und is null im MySQL-Handbuch.

    Freundliche Grüße

    Vinzenz

  3. Hi,

    dein DB Design ist suboptimal. Ist es eigentlich in 90% der Fälle, wenn DISTINCT verwendet werden muss.

    Warum nutzt du nicht eine einzelne Tabelle und markierst "Lieblingskunden" durch eine Spalte vom Typ Boolean.

    Ansonsten sollte gelten (vorausgesetzt, du kannst Subqueries verwenden)

    SELECT .... FROM Kunden
    WHERE eMail NOT IN (SELECT eMail FROM Lieblingskunden)

    Das hatte ja Rouven schon irgendwie festgestellt.

    Ciao, Gut Nacht, Frank