zoukankan      html  css  js  c++  java
  • PostgreSQL-With子句实现递归

    上手:

    自顶向下
    with recursive tree AS (
        select dep.id,dep.name,dep.parent_id from department dep where dep.id = 1
    
        union all 
    
        select dep.id,dep.name,dep.parent_id from department dep inner join tree on dep.parent_id = tree.id
    ) select * from tree;
    

     

    sql  实现 菜单树展示:

    WITH RECURSIVE tree AS (
    SELECT
    dep.ID,
    dep.NAME,
    dep.type,
    dep.code,
    dep.route,
    dep.market_app_id,
    dep.icon,
    dep.parent_id
    FROM
    uaa_res_ui dep
    WHERE
    dep.id = 171989007847143424 UNION ALL
    SELECT
    dep.ID,
    dep.NAME,
    dep.type,
    dep.code,
    dep.route,
    dep.market_app_id,
    dep.icon,
    dep.parent_id
    FROM
    uaa_res_ui dep
    INNER JOIN tree ON dep.parent_id = tree.ID
    ) SELECT
    *
    FROM
    tree;

    该语句是从子部门(id = 7)向上查询,即查询该部门的父部门。同样的我们也可以修改第二行后数值 ”7“ 来查看不同的结果。如下:

    -- 自下向上
    with recursive tree as (
        select dep.id,dep.name,dep.parent_id from department dep where dep.id =7
    
        union all 
    
        select dep.id,dep.name,dep.parent_id from department dep inner join tree on tree.parent_id = dep.id
    ) select * from tree;
    
    -- 查询的结果
    -- id   name    parent_id
    -- 7    二级部门3   2
    -- 2    一级部门1   1
    -- 1    顶级部门    0

    注意:

    语法

    with recursive 名字 as (
        A.初始语句(非递归部分)
    
        union all 
    
        B.递归部分语句
    
    ) [SELECT | INSERT | UPDATE | DELETE]

    可以到 WITH RECURSIVE 与普通的 WITH 相比,最大的不同就是 as () 中的 的内容。内容被 union all 一分为二,前半部分 A 为非递归语句,后半部分 B 为要进行的递归语句。

    执行步骤如下

    1. 执行 A 部分。(如果使用的是union而非union all,则需对结果去重)其结果作为 B 中对result的引用,同时将这部分结果放入临时的working table中
    2. 重复执行如下步骤,直到working table为空:用working table的内容替换递归的自引用,执行 B ,(如果使用union而非union all,去除重复数据),并用该结果(如果使用union而非union all,则是去重后的结果)替换working table

    注意项

    1. 初始语句 A 中的列与递归部分语句 B 的列必须要一一对应
    2. 初始语句 A 、递归部门语句 B 查询的时候不要使用 * 号来代替列
    3. 一定要有结束条件,否则会进入死循环
    假如我的博客对你有用,请你关注我一下,告诉我你来过,你的关注是我前进的动力,希望更多的人记录自己的问题,去帮助别人更是帮助自己避免再次出现这样那样的问题,谢谢你的来过!
  • 相关阅读:
    设置java.library.path的值(Mac/Linux/Windows)
    英特尔老款CPU支持虚拟化对照表(转)
    长城小主机GW1等型号进BIOS的设置方法
    Mac 10.12允许任何来源
    DDos与CC攻击的简单个人理解
    Mac 10.12下iTerm2使用lrzsz上传下载文件
    Mac 10.12连接iSCSI硬盘软件iSCSI Initiator X
    华为S5300系列交换机V100R005SPH021升级补丁
    华为S5300系列交换机V100R005SPH020升级补丁
    华为S5300系列交换机V100R006SPH019升级补丁
  • 原文地址:https://www.cnblogs.com/zxy-come-on/p/14447635.html
Copyright © 2011-2022 走看看