在 CTE 中合并删除记录,但没有重复项

  • 本文关键字:CTE 合并 删除 记录 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。

当我使用联合所有时,我再次得到 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时不会发生这种情况的原因。

最新更新