select distinct a1.id
from m a1, m a2
on a1.Id = a2.Id
where a1.sub = 'physics' and a2.sub <> 'chem';
物理は取ったが化学は取っていない学生が欲しいですか?
私に間違った結果を与える?
入力はありますか?
を使用してnot exists
:
select *
from m a1
where a1.sub = 'physics'
and not exists (select 1 from m where id = a1.id and sub = 'chem')
これは、set-within-sets クエリの例です。group by
と を使用したソリューションは次のhaving
とおりです。
select a.id
from m a
group by a.id
having sum(a.sub = 'physics') > 0 and
sum(a.sub = 'chem') = 0;
この式sum(a.sub = 'physics')
は、「物理」の行数をカウントします。は> 0
、少なくとも 1 つ存在する必要があると述べています。同様に、2 番目の句は、"chem" を含む行がないことを示しています。
このアプローチの利点は、簡単に一般化できることです。たとえば、生物学の要件を含めるには:
from m a
group by a.id
having sum(a.sub = 'physics') > 0 and
sum(a.sub = 'bio') > 0 and
sum(a.sub = 'chem') = 0;
このクエリを試すことができます
SELECT distinct m.id
FROM from table_name m
WHERE
m.a1 like 'physics'
and m.a2 <>'chem';