2
select distinct a1.id
from m a1, m a2
on a1.Id = a2.Id
where a1.sub = 'physics' and a2.sub <> 'chem';

物理は取ったが化学は取っていない学生が欲しいですか?

私に間違った結果を与える?

入力はありますか?

4

3 に答える 3

4

を使用してnot exists

select * 
from m a1
where a1.sub = 'physics'  
and not exists (select 1 from m where id = a1.id and sub = 'chem')
于 2013-07-18T14:28:10.243 に答える
3

これは、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;
于 2013-07-18T14:27:00.767 に答える
1

このクエリを試すことができます

SELECT  distinct m.id 
FROM from table_name m 
WHERE
    m.a1 like 'physics' 
    and m.a2 <>'chem';
于 2013-07-18T14:40:09.540 に答える