2014-10-08 64 views
1

我想使用where子句为下表选择一些数据。SQL Server R2:使用Where子句选择语句

create table test 
(
    pid int, 
    pname varchar(10) 
) 

插入一些数据:

insert into test values(1,'Active'); 
insert into test values(1,'DeActive'); 
insert into test values(2,'Active'); 
insert into test values(2,'DeActive'); 
insert into test values(3,'Active'); 
insert into test values(3,'Active'); 
insert into test values(4,'Active'); 
insert into test values(5,'DeActive'); 

现在我想从测试,其中过程的ID pid既有的进程名是Active和显示数据DeActive

预期结果

pid 
---- 
1 
2 

pid 1和2同时具有进程名pnameActiveDeActive上述过程ID。

回答

4

您可以使用相交,以获得常规的PID值,请检查下面的查询:

Select Distinct pid From Test Where 
pname ='Active' 
Intersect 
Select Distinct pid From Test Where 
pname = 'DeActive' 
+0

非常感谢。 – Meem 2014-10-08 07:02:33

0
select a.pid 
from test a 
join test d on a.pid = d.pid and d.pname = 'DeActive' 
where a.pname = 'Active' 
+1

它会显示错误的歧义列名'pid' – 2014-10-08 06:56:29

+0

我添加了a,虽然它可能是b。以及。 – 2014-10-08 06:58:11

0

这是一个没有任何硬编码值和可编辑数字“1”,未来pnames

select distinct pid from (select pid,count(distinct pname) as cnt 
from test 
group by pid) tab 
where cnt>1 
0
SELECT 
    a.pid 
FROM 
    dbo.test a 
join 
    dbo.test b on a.pid = b.pid 
    and a.pname = 'Active' and b.pname = 'DeActive' 
+0

添加一些解释! – 2014-10-08 07:20:41

+0

这是一个自我连接的表测试,以实现本来是两张表的。如果你有一个表T1为(pid,'activate),第二个表T2为(pid,'deactivate'),可以这样想。那么几乎任何人都会做T1 JOIN T2 ON谓词的pid。在上面的查询中,别名“a”和别名“b”表示相同的关系。 – sqlwithpanks 2016-07-08 09:48:44

1
select distinct a.pid 
    from test a 
    join test b on a.pname=b.pname 
    where a.pname not in('Deactive') and a.pid < 3 
0

怎么样这...

Select Pid from 
(
select pid , Count (distinct pname) as Pnamecount from test as a 
group by pid 
having COUNT(*) > 1 
) as temp 
Where temp.Pnamecount != 1