我在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中应该没有重复项,因为我声明了字段覆盖。
答案 0 :(得分:4)
UNION
正在从结果集中删除重复项。你必须在CTE_A中有这样的东西:
22 | Full
22 | Full
当你SUM()
CTE_A时,两者都被计算在内。但是在UNION
之后,您只会有一条记录,将SUM()
总数从CTE_C降低到78(100-22=78
)。
UNION ALL
不会删除重复项,这就是为什么当您加入ALL
时不会发生这种情况。