如何从具有跨同一列的多行的条件的单个表中进行选择

时间:2016-12-27 17:44:46

标签: sql oracle

我有一个表格,其中包含医疗号码和程序的列。有很多行,医学数字可以用很多程序重复;例如:

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

我想选择具有过程30并且没有过程20的所有mid_no。在上面的示例中,所需的结果将是:

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

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

答案 2 :(得分:0)

只需对表格进行一次扫描,即可使用:

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

内部查询针对每个20计算两个不同值中30Mid_no的出现次数;外部人员只选择唯一没有出现20且至少有一次出现30的记录。