5

我有这样的桌子。

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

我想编写返回所有没有 kvalifikation 2 的人的 SQL 查询。

我写

SELECT DISTINCT PersonID where NOT KvalifikationID = 2

但这会返回第 1 个人和第 2 个人。我如何选择只返回没有 kval2 的 personId?

4

5 回答 5

9

试试这个,

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

SQLFiddle 演示

于 2012-09-25T07:11:48.140 回答
4
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

结果

PersonId
2
于 2012-09-25T07:17:44.467 回答
3
SELECT DISTINCT person_id
FROM tableName t1
WHERE not exists 
(
  select 1 
  from tableName 
  where person_id = t1.person_id and KvalifikationId = 2 
)
于 2012-09-25T07:13:21.523 回答
3

通过Person在外部查询中使用您的表而不是您的 N:N 表,您可以跳过distinct子查询的反半连接,因为它位于聚集索引上,所以性能会更好。(假设表PersonID中为pk Person

SELECT PersonID
FROM tblPerson
WHERE NOT EXISTS
    (
        SELECT NULL
        FROM tblPersonKvalifikation
        WHERE KvalifikationId = 2 AND 
              tblPerson.PersonID = tblPersonKvalifikation.PersonID
    )
于 2012-09-25T07:28:53.313 回答
-1

试试这个。
SELECT DISTINCT PersonID from tableName
WHERE KvalifikationId NOT IN ('2');

于 2012-09-25T07:26:11.143 回答