2014-10-08 3 views
1

Я хочу выбрать некоторые данные с предложением where для следующей таблицы.SQL Server R2: выберите оператор where 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'); 

Теперь я хочу, чтобы показать данные из теста, где идентификатор процесса, который pid имеет оба названия процесса, который Active и DeActive.

Ожидаемый результат:

pid 
---- 
1 
2 

Примечание: Указанный выше идентификатор процесса pid 1 и 2, имеющие как имя процесса pnameActive что и DeActive.

ответ

4

Вы можете использовать Intersect, чтобы получить общие Pid значения, проверьте ниже запрос:

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

Большое вам спасибо. – Meem

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» –

+0

Я добавил а., хотя это может быть б. также. –

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

добавьте несколько объяснений! –

+0

Это самосоединение на тестовом столе для достижения того, что в противном случае было бы двумя таблицами. Подумайте об этом таким образом, если бы у вас была одна таблица T1 как (pid, «активировать») и вторую таблицу T2 как (pid, «deactivate»). Тогда почти каждый будет делать T1 JOIN T2 ON предикат pid. В вышеприведенном запросе псевдоним «a» и псевдоним «b» представляют это же отношение. – sqlwithpanks

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 
Смежные вопросы