2016-12-27 8 views
3

医療番号と手順の列を含むテーブルがあります。多くの行があり、多くの手順で医療番号を繰り返すことができます。例えば:同じ列の複数の行にわたって条件付きの単一のテーブルから選択する方法

Mid_no procedure 
-------------------- 
100.   20 
100.   30 
200.   30 

私は手順30を持っており、上記の例では手順20を持たないすべてのmid_noを選択するには、望ましい結果は次のようになります。

Mid_no. Procedure 
--------------------- 
200.  30 

答えて

3
SELECT t.mid_no, 
    t.procedure 
FROM TABLE t 
WHERE NOT EXISTS 
    (SELECT 1 FROM TABLE t1 WHERE t1.mid_no = t.mid_no AND t1.procedure = 20 
) 
AND t.procedure = 30; 
+0

申し訳ありませんTは私のテーブルですT1とは何ですか? –

+0

@ahmeddevilテーブルのエイリアスです。列を修飾するために完全なテーブル名を記述する必要がないようにすると便利です。 – GurV

+0

@ahmed上記のクエリで** TABLE **の代わりに独自のテーブル名を使用 – GurV

1
select mid_no from table where procedure = 30 
intersect 
select mid_no from table where procedure != 20 
0

テーブルを1回スキャンすると、次のように使用できます。

select distinct Mid_no 
from (
     select count(case when procedure=20 then 1 end) over (partition by Mid_no) as has20, 
       count(case when procedure=30 then 1 end) over (partition by Mid_no) as has30, 
       Mid_no 
     from yourTable 
    ) 
where has20 = 0 
    and has30 != 0 

内部クエリーは、Mid_noの2つの異なる値で、2030の出現回数をカウントします。外部のものは、単に20の出現がなく、30の少なくとも1つの出現を有する唯一のレコードを選ぶだけである。

関連する問題