2016-06-07 6 views
0

Ich muss überprüfen, dass in meiner #Personal-Tabelle kein Client vorhanden sein sollte, der keine ABC-E-Mail erhalten hat.SQL-Alle Clients sollten mindestens eine bestimmte E-Mail erhalten

Ich schreibe mit Self Join .. ist es richtig, oder ich sollte einfach Unterabfrage schreiben?

meinem Tisch hat Liste von Client-IDs und E-Mail-Details senden. (Wie E-Mail Code, Datum des Ereignisses)

Select 
* 
from #Personal a 
join #Personal b 
on a.id=b.id 
where b.emailcode<> 'ABC' 

oder

select * from #Personal 
where a.id in (select id from #personal where b.emailcode <>'ABC') 

Antwort

0
Select * 
FROM #Personal a 
WHERE NOT EXISTS (SELECT 1 
        FROM #Personal b 
        WHERE a.id=b.id 
        AND b.emailcode = 'ABC') 

Wenn die ID Spalte keine Nullwerte enthalten ist, können Sie auch

SELECT * FROM #Personal 
where id NOT IN (select id from #personal 
       where emailcode = 'ABC') 
+0

verwenden Ich denke, das ist falsch, warum: es wie wählen sollte * von #Personal A NOT EXISTS (Wählen Sie 1 aus #Personal B, wobei a.id = b.id und b.emailcode <> 'ABC'). Bitte Kommentar –

+0

@nancyarora Ich benutze 'NOT EXISTS' und' NOT IN' daher wird es 'emailcode = 'ABC'', ich glaube, du bist nach der Liste der Leute, die eine bestimmte E-Mail nicht bekommen hat ??? Wenn das der Fall ist, sollte das funktionieren. –

+0

nach meinem Datenverständnis, dann wird es alle IDs zurückgeben, die ABC nicht erhalten haben, aber hae erhalten haben, anderen E-Mail-Code wie CD, EF, GH zum Beispiel zu sagen. –

0

Sie eine Liste von Leuten bekommen, die nicht erhalten haben eine solche E-Mail-group by und having Verwendung:

select p.id 
from #Personal p 
group by p.id 
having sum(case when p.emailcode = 'ABC' then 1 else 0 end) = 0; 

eine alternative Form des having Klausel ist:

having max(case when p.emailcode = 'ABC' then 'ABC' end) is null 
Verwandte Themen