Vermutlich triviale SQL-Anfrage
Eddie
- datenbank
0 Rouven1 Vinzenz Mai0 Frank (no reg)
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
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
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
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