我有一个问题与另一个问题非常相似,但我无法弄明白。以下是原始问题的链接:Oracle/SQL - Finding records with one value excluding by similar record
与那个问题类似,我的记录要么是1,要么是null。相同的记录可以是1或null的组合,在这些情况下,我想完全排除记录。例如:
Person Type
--------------
Bob 1
Sue 1
Bob null
Tom 1
Frank 1
Frank null
Fred null
我希望返回以下内容:
Person Type
--------------
Sue 1
Tom 1
对此的任何指示都将非常感激。我没有太多时间来解决这个问题,所以即使在概念上讲也会有所帮助!
我最近的是
select person from table
where type = 'S'
MINUS
select person from table
where type is null
但当然不起作用。
如果这是唯一的方法,我可以写一个函数。谢谢!
答案 0 :(得分:2)
试试这个:
select person, type from table
where type = '1'
and person not in (select person from table where type is null)
答案 1 :(得分:2)
除了Mark的NOT IN
方法,这也可以写成NOT EXISTS
条件:
select p1.person
from person p1
where p1.type = 1
and not exists (select 1
from person p2
where p1.person = p2.person
and p2.type is null)
order by p1.person;
它基本上是这样说的:给我每个类型为1的人,但是对于这个类型为null的人没有其他行。
SQLFiddle示例:http://sqlfiddle.com/#!4/7623c/4
答案 2 :(得分:1)
您可以使用分析功能轻松完成此操作,这些功能通常可以提供非常好的性能:
select p.*
from (select p.*,
sum(case when type is null then 1 else 0 end) over (partition by person) as Nullcnt
from person p
) p
where nullcnt = 0;