2017-09-04 8 views
1

入力を使用していない、要素の一つで結果セットからグループを除外する方法:SQL:サブクエリ

id group_id type_id  
1  1   aaaaa   
2  1   BAD 
3  2   bbbbb 
4  2   ccccc 
5  3   ddddd 
6  3   eeeee 
7  3   aaaaa 
  1. を私は出力にのみtype_id <> 'BAD'メンバーから成るgroup_id秒を必要としています。少なくとも1つのBADメンバーを含むグループ全体を除外する必要があります。
  2. サブクエリ(またはCTEまたはNOT EXISTSまたはビューまたはT-SQLインライン関数)の使用は許可されていません。
  3. exceptの使用は許可されていません。
  4. カーソルの使用はできません。

上記のルールを無効にするすべてのソリューションが評価されます。どんなRDBMSでもOKです。

悪い例溶液(exceptを使用して)、正しい結果を生成:

select distinct group_id 
from input 
except 
select group_id 
from input 
where type_id = 'bad' 
group by group_id, type_id 

出力:

select group_id 
from input 
group by group_id 
having min(type_id) = 'good' and max(type_id) = min(type_id); 

この特定のバージョン:

group_id 
2 
3 

答えて

2

グループと'BAD'の発生をカウント:

EDIT:

あなたが悪いものを探している場合は、単に行う

select group_id 
from mytable 
group by group_id 
having count(case when type_id = 'BAD' then 'count me' end) = 0; 
4

私はちょうどgroup byhavingを使用しますと仮定すると、type_id(質問のように)NULL値を取ることはありません。それを考慮に入れて簡単に変更できます。 group_idによって

select group_id 
from input 
where type_id = 'bad' 
group by group_id; 
+0

私は私が間違っを尋ねたと思います私の実際のケースでは、 'type_id'は任意の値(nullではない)を取るかもしれませんが、値が1つだけ悪いです。答えはまだ素晴らしいです。 –