sql中with怎么使用 WITH临时表达式的2种递归写法

sql中with怎么使用 WITH临时表达式的2种递归写法
最新回答
吃素的蚊子

2022-02-23 11:01:55

递归 WITH 表达式用于处理层级结构数据,主要有两种写法:基本递归和多锚点递归。

  • 基本递归:适用于单根层级结构,包含锚定成员和递归成员。锚定成员定义递归起点,递归成员引用自身生成新结果集。

    锚定成员:找到所有顶级员工(没有上级)。

    递归成员:通过连接找到所有下级员工,并递增层级。

    WITH RECURSIVE employee_hierarchy AS ( -- 锚定成员:找到所有顶级员工(没有上级) SELECT id, name, manager_id, 1 AS level FROM employees WHERE manager_id IS NULL UNION ALL -- 递归成员:找到所有下级员工 SELECT e.id, e.name, e.manager_id, eh.level + 1 AS level FROM employees e JOIN employee_hierarchy eh ON e.manager_id = eh.id)SELECT * FROM employee_hierarchy;
  • 多锚点递归:适用于多根层级结构,包含多个锚定成员和递归成员。多个锚定成员定义多个起点,递归成员引用自身生成新结果集。

    锚定成员1:找到所有最终产品段棚塌(没有零件组成它们)。

    锚定成员2:找到所有原材料(没有子零件)握圆。

    递归成员:通过连接找到和芹所有零件的组成部分,并递增层级。

    WITH RECURSIVE parts_explosion AS ( -- 锚定成员1:找到所有最终产品(没有零件组成它们) SELECT part_id, part_name, 1 AS level FROM parts WHERE is_final_product = TRUE UNION ALL -- 锚定成员2:找到所有原材料(没有子零件) SELECT part_id, part_name, 1 AS level FROM parts WHERE is_raw_material = TRUE UNION ALL -- 递归成员:找到所有零件的组成部分 SELECT p.part_id, p.part_name, pe.level + 1 AS level FROM parts p JOIN parts_explosion pe ON p.parent_part_id = pe.part_id)SELECT * FROM parts_explosion;