跨平台SQL实现父子层级增量路径生成方案咨询
跨SQL平台通用递归CTE实现层级路径生成及疑问解答
需求说明
在不同SQL平台中,无需使用sys_connect_by_path这类特定厂商函数,实现基于父子关系与Relation字段生成增量层级路径。
输入数据
child Parent Society Relation B A YUM ppp C B YUM qqq D C YUM ccc A None YUM ooo A None PUM ooo Y Z YUM qwe W Y YUM dfr V W YUM asd Z None YUM rtg
期望输出
childId PATH level A ooo 1 B ooo|ppp 2 C ooo|ppp|qqq 3 D ooo|ppp|qqq|ccc 4 A ooo 1 Z rtg 1 Y rtg|qwe 2 W rtg|qwe|dfr 3 V rtg|qwe|dfr|asd 4
疑问
针对递归CTE方案,首次迭代后,初始层级的记录是否不会再次参与后续关联?
解答
递归CTE分为锚点成员和递归成员两部分:
- 锚点成员就是首次迭代的初始层级记录(也就是Parent为None的根节点),只会执行一次,生成初始结果集。
- 递归成员会不断用当前迭代的结果集去关联原始表,找到子节点,直到没有新的子节点可以关联为止。
在整个递归过程中,锚点成员的记录不会再次参与后续的关联逻辑——后续迭代只会用递归成员产出的中间结果(也就是已经生成路径的非根节点)去匹配原始表中的父节点,不会再回头去关联锚点里的根节点。
举个例子,锚点里的A、Z这些根节点,只会在第一次迭代中生成level=1的记录;后续迭代只会用B、Y这些level=2的记录去匹配它们的子节点C、W,以此类推,根节点不会再被纳入关联范围。
内容的提问来源于stack exchange,提问作者Carol
相关产品推荐
相关产品推荐

