2012-09-25 32 views
5

Tôi có bảng như thế này.SQL select Đặc biệt với mệnh đề where

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

Tôi muốn viết SQL querye trả lại tất cả những người, có không kvalifikation 2.

i Wrote

SELECT DISTINCT PersonID where NOT KvalifikationID = 2 

Nhưng sự trở lại này cả hai người 1 và người 2. Làm thế nào để tôi làm cho lựa chọn mà chỉ trả lại personId mà không có kval2?

Trả lời

7

Hãy thử điều này,

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

SQLFiddle Demo

+0

Ty, hoạt động tốt. –

+0

@Scarface bạn được chào đón! –

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 

quả

PersonId 
2 
-1

thử này.
CHỌN DISTINCT PersonID từ tableName
WHERE KvalifikationId NOT IN ('2');

3

Bằng cách sử dụng bảng Person thay vì bảng N: N trong truy vấn bên ngoài, bạn có thể bỏ qua distinct và chống tham gia vào truy vấn phụ sẽ có hiệu suất tốt hơn vì nó nằm trên chỉ mục nhóm. (giả sử PersonID là pk trong bảng Person)

SELECT PersonID 
FROM tblPerson 
WHERE NOT EXISTS 
    (
     SELECT NULL 
     FROM tblPersonKvalifikation 
     WHERE KvalifikationId = 2 AND 
       tblPerson.PersonID = tblPersonKvalifikation.PersonID 
    ) 
Các vấn đề liên quan