SQL选择与where子句不同

时间:2012-09-25 07:10:03

标签: sql

我有这样的表。

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

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

我写了

SELECT DISTINCT PersonID where NOT KvalifikationID = 2

但这会让人1和2都归来。 如何选择只返回没有kval2的人ID?

5 个答案:

答案 0 :(得分:7)

试试这个,

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

SQLFiddle Demo

答案 1 :(得分:3)

SELECT DISTINCT person_id
FROM tableName t1
WHERE not exists 
(
  select 1 
  from tableName 
  where person_id = t1.person_id and KvalifikationId = 2 
)

答案 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

<强>结果

PersonId
2

答案 3 :(得分:3)

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

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

答案 4 :(得分:-1)

试试这个。
从tableName中选择DISTINCT PersonID KvalifikationId不在(&#39; 2&#39;);