>我有一个查询,查询了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。
当我使用联合所有时,我再次得到 100。 我知道联合删除了重复项,但CTE_A和CTE_B内不应该有重复项,因为我正在声明字段覆盖范围。
UNION
正在从结果集中删除重复项。 您必须在CTE_A中具有以下内容:
22 | Full
22 | Full
当你SUM()
CTE_A时,两者都被计算在内。 但是在你UNION
之后,你将只有一个记录,将SUM()
总数从CTE_C降低到78(100-22=78
)。
UNION ALL
不会删除重复项,这就是为什么当您包含ALL
时不会发生这种情况的原因。