使用with子句消除具有空值的重复行

时间:2019-02-20 01:19:23

标签: sql oracle distinct common-table-expression distinct-values

我们如何通过使用with子句语句仅选择某个字段中具有值的重复项来消除重复项?

查询是这样的:

with x as (--queries with multiple join tables, etc.)
select distinct * from x

以下输出:

Com_no   Company      Loc    Rewards
1         Mccin      India      50
1         Mccin      India
2         Rowle      China      18
3         Draxel     China      11
3         Draxel     China  
4         Robo       UK          

如您所见,我得到了重复的记录。我想摆脱不是唯一的空值。就是说,Robo是唯一的,因为它在Rewards中只有1条记录具有空值,所以我想保留它。

我尝试过:

 with x as (--queries with multiple join tables, etc.)
 select distinct * from x where Rewards is not null

当然那是不对的,因为它也摆脱了4 Robo UK

预期输出应为:

1         Mccin      India      50
2         Rowle      China      18
3         Draxel     China      11 
4         Robo       UK      

2 个答案:

答案 0 :(得分:1)

这是一个优先级查询。一种方法是使用row_number()。如果每个Com_no / Company / Loc只需要一个值,则:

select x.*
from (select x.*,
             row_number() over (partition by Com_no, Company, Loc order by Rewards nulls last) as seqnum
      from x
     ) x
where seqnum = 1;

甚至:

select Com_no, Company, Loc, max(Rewards)
from x
group by Com_no, Company, Loc;

答案 1 :(得分:0)

问题在于您将这些行称为重复项,但它们并非重复项。他们不同。因此,您想要做的是排除Rewards为null的行,除非没有不具有非null值的行,然后选择不同的行。像这样:

select distinct * 
from x a
where Rewards is not null 
or (Rewards is null and not exists (select 1 from x b where a.Com_no = b.Com_no 
    and b.Rewards is not null)

现在,您的机器人行仍将包括在内,因为Robo中x中没有奖励不为空的行,但是其他奖励为空的公司的行将被排除,因为它们的行不为空。