更新时间:2025-05-29 GMT+08:00

RecursiveUnion

算子说明

RecursiveUnion算子用于处理递归调用的UNION语句,该类语句通常出现在CTE表达式中。常见的语法逻辑为:有一个初始输入集作为递归过程的初始数据,然后开始进行递归调用得到输出,最后将本次递归调用的输出作为下次递归调用的输入,循环调用得到最终的输出。

典型场景

带RecursiveUnion的SQL语句。

示例

示例:带RecursiveUnion的SQL语句。

--数据准备。 
gaussdb=# DROP TABLE IF EXISTS t1;
gaussdb=# CREATE TABLE t1(c1 number, c2 number, c3 number); 
CREATE TABLE 
gaussdb=# INSERT INTO t1 VALUES(generate_series(1, 100), 2, 3); 
INSERT 0 100

--执行结果。 
gaussdb=# EXPLAIN WITH RECURSIVE t1(n) AS ( 
VALUES(1) 
UNION ALL 
SELECT n+1 FROM t1 WHERE n < 100) 
SELECT sum(n) FROM t1;
                                QUERY PLAN
---------------------------------------------------------------------------
 Aggregate  (cost=3.65..3.66 rows=1 width=12)
   CTE t1
     ->  Recursive Union  (cost=0.00..2.96 rows=31 width=4)
           ->  Values Scan on "*VALUES*"  (cost=0.00..0.01 rows=1 width=4)
           ->  WorkTable Scan on t1  (cost=0.00..0.23 rows=3 width=4)
                 Filter: (n < 100)
   ->  CTE Scan on t1  (cost=0.00..0.62 rows=31 width=4)
(7 rows)

--删除。
gaussdb=# DROP TABLE IF EXISTS t1;

上述示例中,RecursiveUnion算子输出信息如下所示。

信息名称

含义

Recursive Union

算子的名称。

Values Scan

算子的名称,对值进行扫描。

WorkTable Scan

将底下筛选出来的结果储存在临时表中。