1、需求
通过postgresql中的函数实现递归查询机构树
2、实现
sql中with xxxx as () 是对一个查询子句做别名,同时数据库会对该子句生成临时表;
with recursive 则是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询,如下面的语句
WITH RECURSIVE d(n, fact) AS (
VALUES (0, 1)
UNION ALL
SELECT n+1, (n+1)*fact FROM d WHERE n < 7
)
SELECT * FROM d
两个参数 n 和 fact 当n<7时递归执行算法,union all 连接结果进行递归操作
运行结果:
3、实际项目应用
摘抄:
calcite 中with recursive算子是RepeatUnion算子实现,在Enumerable的adapter中具体的物理实现EnumerableDefaults::repeatUnionAll方法,在Enumerable的调用约定中,底层的物理实现返回一个Enumerable对象,该对象中会有一个枚举器,枚举器中定义了数据的获取方法,包括current,moveNext等方法;