2009-06-16 7 views

Antwort

13

Versuchen

SELECT Email.address 
FROM Email LEFT OUTER JOIN DoNotMail on Email.address = DoNotMail.address 
WHERE DoNotMail.address is null 

Es vermeidet eine Unterabfrage zu benötigen.

+0

Ha, ich habe gerade eine ähnliche Frage gestellt, als ich eine neue Antwort geschrieben habe. Gute Sache, die ich vor dem Einreichen überprüft habe. – Powerlord

+0

Scheint eine Flut von Antworten zu sein - die vier vor mir wurden alle gepostet, während ich meine Antwort schrieb :) –

+0

+1 dieser ist performant und elegant –

3
select u.email from users u where u.email not in (select email from donotemail) 

ODER

wählen u.email von den Benutzern u inneren donotemail d auf u.email beitreten = d.email

EDIT: Die Verbindung funktioniert nicht

+1

"innen verbinden donotemail d auf u.email! = D.email" ?? Sie werden bei jedem anderen Benutzer mitmachen, nicht wahr? –

+0

Ja, aber das wird ein Nullsatz sein, da donoteamail als primären Schlüssel eine E-Mail haben sollte –

+1

was? u = [[email protected], [email protected], [email protected]], donotemail = [a, b] => innere Verbindung auf verschiedenen = [a/b, b/a, c/a, c/b] Nein? –

0
select email from users where email not in (select email from donotemail) 
+1

Ein Join ist viel schneller als eine Subselect – artemb

+0

Wenn Sie eine NULL-E-Mail in Donotemail haben, wird es eine leere Menge zurückgeben –

+0

@artemb es abhängt, subselect kann nur einmal ausgeführt werden, wenn der Abfrageoptimierer versteht, dass es nicht erneut abgerufen werden soll –

1

Versuchen Sie folgendes:

SELECT email 
FROM users u 
WHERE NOT EXISTS(
    SELECT 1 FROM no_mail_users nmu 
    WHERE nmu.id = u.id 
) 
+0

korrelierte Unterabfragen sind extrem, EXTREM langsam, da Sie eine Abfrage pro Zeile in der äußeren Tabelle haben. – Powerlord

1

Warum fügen Sie nicht einfach eine weitere Spalte in Ihre E-Mail-Tabelle mit der Bezeichnung Aktiv ein, wenn sie auf 1 gesetzt ist, sendet sie gerade E-Mails, und wenn sie auf 0 gesetzt ist, können Sie nur E-Mails auswählen und filtern.

Prost

Verwandte Themen