2013-03-28 41 views
3

假设我有以下表格 Person tablepersonStatus table如何选择他们的状态只在一个集合中的记录?

declare @Persons table 
(PersonId int) 

insert into @Persons select 10 
insert into @Persons select 11  
insert into @Persons select 12 
insert into @Persons select 13 
insert into @Persons select 14  

declare @PersonStatus table 
(id int,statuss int) 
insert into @PersonStatus (id,statuss) values(14,4) 
insert into @PersonStatus (id,statuss) values(10,0) 
insert into @PersonStatus (id,statuss) values(10,0) 
insert into @PersonStatus (id,statuss) values(11,1) 
insert into @PersonStatus (id,statuss) values(10,1) 
insert into @PersonStatus (id,statuss) values(11,2) 
insert into @PersonStatus (id,statuss) values(12,0) 
insert into @PersonStatus (id,statuss) values(12,1) 
insert into @PersonStatus (id,statuss) values(12,2) 
insert into @PersonStatus (id,statuss) values(13,1) 
insert into @PersonStatus (id,statuss) values(13,3) 

现在我想找到的人ID的他们的状态都只是在这个集合{0,1,2} 结果是---“10,11,12

怎么做?

+0

如果你计划你的 “限制” 的标准是动态的(或参数),检查出我问一会儿回来的问题:http://stackoverflow.com/questions/7492699/how-can-i-structure-a-query-to-give-me-only-the-rows-that-match-all-values-in-a。除了我的输入是限制集的CSV字符串外,它和您的一样。 – Gibron 2013-03-28 07:28:05

回答

3
SELECT ID 
FROM PersonStatus 
GROUP BY ID 
HAVING SUM(CASE WHEN statuss IN (0, 1, 2) THEN 1 ELSE 0 END) >= 1 AND 
     SUM(CASE WHEN statuss NOT IN (0, 1, 2) THEN 1 ELSE 0 END) = 0 
+0

+1使用'HAVING' :) – Gibron 2013-03-28 07:31:59

2

试试这个

SELECT DISTINCT ID 
FROM @PersonStatus PT 
WHERE NOT EXISTS (SELECT * FROM @PersonStatus WHERE statuss not in (0,1,2) AND id=PT.id) 
+0

如果结果集为'{0,1,4}',那么结果如何?使用您的查询,结果将包括'status = 2'和'status = 3'的'id' – praveen 2013-03-28 07:19:38

+1

@praveen然后替换'statuss> 2'与'statuss in(0,1,4)' – 2013-03-28 07:22:08

+0

是的,然后好心地更新您的查询。 – praveen 2013-03-28 07:22:40

相关问题