求一个简单而难的SQL语句

写一个SQL语句,找出下面表中符合条件的order_id
条件:order_id对应的status中REFUND,但是不能有OPEN
如果100对应的status有REFUND、OPEN,则100不属于,而111则符合。
id order_id status
1 100 OPEN
2 111 REFUND
3 100 REFUND
4 100 VOID
5 111 LIFT
6 110 OPEN

不考虑效率,oracle的一个简单语句:
select order_id from tabname where status='refund' and order_id not in(select order_id from tabname where status='open');

not in 改为 not exists 呢?

oracle下,用分析函数效率不错,表只扫描一次:

[code="sql"]SELECT m.orderid
FROM (SELECT t.orderid,
t.status,
SUM(CASE WHEN t.status = 'OPEN' THEN 1 ELSE 0 END) over(PARTITION BY t.orderid) cnt
FROM test3 t) m
WHERE m.status = 'REFUND'
AND m.cnt = 0[/code]

直接minus
select order_id from tabname where status='refund' minus (select order_id from tabname where status='open')

使用minus要排序,大数据量的时候避免使用