2012-09-25 11 views
5

Mam taki stół.SQL select Distinct z tym, gdzie klauzula

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

Chcę napisać SQL querye powracającego wszystkim osobom, które mają nie kvalifikation 2.

pisałem

SELECT DISTINCT PersonID where NOT KvalifikationID = 2 

ale ten zwrot zarówno osoba 1 osoba 2. i jak mogę dokonać wyboru, który zwraca tylko personId, które nie mają kval2?

Odpowiedz

7

Spróbuj tego,

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

SQLFiddle Demo

+0

Ty, działa dobrze. –

+0

@Scarface, serdecznie zapraszamy! –

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 

Wynik

PersonId 
2 
-1

spróbować.
WYBIERZ DISTINCT PersonID od tableName
GDZIE KvalifikationId NOT IN ("2");

3

Za pomocą tabeli Person zamiast tabeli N: N w zapytaniu zewnętrznym można pominąć distinct, a łączenie antypołączeniowe z zapytaniem podrzędnym będzie miało lepszą wydajność, ponieważ znajduje się w indeksie klastrowym. (przyjmując, że PersonID to pk w tabeli Person)

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