2012-09-25 16 views
5

Ho tabella in questo modo.SQL select Distinct with where clausola

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

voglio scrivere SQL querye tornare tutte le persone, che non hanno kvalifikation 2.

ho scritto

SELECT DISTINCT PersonID where NOT KvalifikationID = 2 

Ma questo ritorno sia persona 1 persona 2. Come faccio fai una selezione che restituisca solo persone che non hanno kval2?

risposta

7

Prova questo,

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

SQLFiddle Demo

+0

Ty, funziona bene. –

+0

@Scarface sei il benvenuto! –

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 

Risultato

PersonId 
2 
-1

provare questo.
SELECT DISTINCT PersonID da tableName
WHERE KvalifikationId NOT IN ('2');

3

Con l'utilizzo del vostro tavolo Person piuttosto che il vostro N: tavolo N nella query esterna si può saltare la distinct ei semi anti-unirsi alla query sub avrà prestazioni migliori dal momento che è su un indice cluster. (Supponendo PersonID è pk nella tabella Person)

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