2012-09-25 7 views
5

Ich habe ich Tabelle wie folgt.SQL Select Distinct mit Where-Klausel

PersonID, KvalifikationId 
1   1 
1   2 
1   3 
2   1 
2   3 

Ich möchte SQL querye schreiben alle Personen Rückkehr, die nicht haben kvalifikation 2.

i

Schrieb
SELECT DISTINCT PersonID where NOT KvalifikationID = 2 

Aber diese Rückkehr sowohl Person 1 und Person 2 Wie kann ich make auswählen, dass nur personId zurückgegeben werden, die nicht kval2 haben?

Antwort

7

die Sie interessieren,

SELECT DISTINCT PersonID 
FROM tableName 
WHERE PersonID NOT IN 
    (
     SELECT PersonID 
     FROM tableName 
     WHERE KvalifikationId = 2 
    ) 

SQLFiddle Demo

+0

Ty, funktioniert gut. –

+0

@Scharte Sie sind willkommen! –

3
SELECT DISTINCT person_id 
FROM tableName t1 
WHERE not exists 
(
    select 1 
    from tableName 
    where person_id = t1.person_id and KvalifikationId = 2 
) 
3
Declare @t table(PersonID int,KvalifikationId int) 
Insert Into @t Select 1 ,1 
Insert Into @t Select 1, 2 
Insert Into @t Select 1,3 
Insert Into @t Select 2 ,1 
Insert Into @t Select 2,3 

Select PersonId From @t 

Except 

Select PersonID From @t where KvalifikationId = 2 

Ergebnis

PersonId 
2 
-1

dies versuchen.
SELECT DISTINCT PersonID von tableName
WHERE KvalificationId NICHT IN ('2');

3

Durch Ihre Person Tabelle anstatt Ihre N: N-Tabelle in der äußeren Abfrage können Sie die distinct und die anti halb auf die Sub-Abfrage beitreten überspringen wird eine bessere Leistung haben, da es auf einem Clustered-Index ist. (PersonID Annahme, daß pk in der Person Tabelle)

SELECT PersonID 
FROM tblPerson 
WHERE NOT EXISTS 
    (
     SELECT NULL 
     FROM tblPersonKvalifikation 
     WHERE KvalifikationId = 2 AND 
       tblPerson.PersonID = tblPersonKvalifikation.PersonID 
    )