2013-10-11 4 views
1

Я хочу, чтобы иметь возможность выбирать людей, которые ТОЛЬКО Азиатский AND Белый. Например, в моей таблице ниже, единственным человеком, которого я хотел бы получить записи, является PersonId 1 и 2 (Желаемый результат).Выбор записей, соответствующих ТОЛЬКО/И критериям для одного столбца

Таблица:

enter image description here

Желаемый результат:

enter image description here

ответ

4

Есть несколько способов, которые вы можете получить результат.

Использование предложения HAVING с агрегатной функцией:

select personid, race 
from yourtable 
where personid in 
    (select personid 
    from yourtable 
    group by personid 
    having 
     sum(case when race = 'white' then 1 else 0 end) > 0 
     and sum(case when race = 'asian' then 1 else 0 end) > 0 
     and sum(case when race not in('asian', 'white') then 1 else 0 end) = 0); 

См SQL Fiddle with Demo

Или вы можете использовать count(distinct race) в имеющей п:

;with cte as 
(
    select personid 
    from yourtable 
    where race in ('white', 'asian') 
    and personid not in (select personid 
         from yourtable 
         where race not in ('white', 'asian')) 
    group by personid 
    having count(distinct race) = 2 
) 
select personid, race 
from yourtable 
where personid in (select personid 
        from cte); 

См SQL Fiddle with Demo

+0

Спасибо! Мне нравится второе решение, так как это выглядит, чтобы легко вставлять значения для гонки и подсчитывать через некоторые входные параметры. – gooseman

2

Это должно сделать

select * from table where personID in (
select personID from table 
group by personID having count(distinct race) = 2 and min(race) = 'Asian' 
and max(race) = 'White') 
+0

Это работает, но не использует min и max, ограничивая меня только двумя расами? Что делать, если я хотел сделать тот же запрос, но с 3 или более расами? (это, безусловно, мой случай). – gooseman

+0

@ leo.t, и в этом случае я отсылаю вас к решению Bluefeet – iruvar

0

Очень наивный, но должен работать.

select * from yourtable t1 join yourtable t2 on t1.id = t2.id where ((t1.race = 'Asian' and t2.race = 'White') OR (t1.race = 'White' and t2.race = 'Asian')) and t1.id not in (select id from yourtable where race not in ('Asian','white')); 
Смежные вопросы