CTE中的联盟删除记录但没有重复

时间:2017-06-08 21:12:04

标签: sql oracle

我在oracle的CTE中有一个联合查询。我试图在我们的数据库中得到一个名为P的字段的总和,并检查以确保在我编写视图时值是准确的。我发现oracle在添加联合

之后以一种不寻常的方式处理这些查询
with CTE_A as 
(select  P, 'full' as coverage from Table_A), 

CTE_B as
(select  P, 'partial' as coverage from Table_A)

如果我select sum(P) from CTE_A,我得到100.但是,如果我执行以下操作:

CTE_C as 
(select P, coverage from CTE_A

union 

select P, coverage from CTE_B)

select sum(P) from CTE_C where coverage='full' 

我得到78.

当我使用union时,我再次获得100。我知道union会删除重复项,但CTE_A和CTE_B中应该没有重复项,因为我声明了字段覆盖。

1 个答案:

答案 0 :(得分:4)

UNION正在从结果集中删除重复项。你必须在CTE_A中有这样的东西:

22 | Full
22 | Full

当你SUM() CTE_A时,两者都被计算在内。但是在UNION之后,您只会有一条记录,将SUM()总数从CTE_C降低到78(100-22=78)。

UNION ALL不会删除重复项,这就是为什么当您加入ALL时不会发生这种情况。