首页 > 解决方案 > SQL - 递归 CTE 中 UNION 和 UNION ALL 之间差异的说明性示例?

问题描述

我在理解使用UNIONUNION ALL递归查询之间的区别时遇到了一些麻烦。在我在日常工作中遇到的示例中,通常没有明显的区别(例如,构建一个单调递增 1 的整数运行列表),但我一直在尝试更正式地使用Torsten Grust精彩的讲义以及 Postgres 和 MySQL 的文档。

例如:

with recursive
     counter as (
        select 0 as i
        union all
        select i + 1
        from
          counter
        where
          i < 10
      )
select * from counter

返回与以下相同的结果:

with recursive
     counter as (
        select 0 as i
        union
        select i + 1
        from
          counter
        where
          i < 10
      )
select * from counter

我感觉在进行分层遍历时存在差异,但我找不到一个很好的说明性示例来说明差异何时很重要。

问题 1:我知道UNION删除重复的行,但我的问题是这些行是从哪里删除的?

递归 CTE 中的 UNION

对比

递归 CTE 中的 UNION ALL

问题 2:是否有人能够提供一个很好的比较案例来显示什么时候 a UNIONvs.UNION ALL会对递归查询产生重大影响?

标签: sqlrecursion

解决方案


推荐阅读