加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

我对Postgresql递归查询的理解

发布时间:2020-12-13 17:04:29 所属栏目:百科 来源:网络整理
导读:先声明,瞎猜的,个人理解,不一定对。 递归查询大家都知道,常见的如一张表,包含id(主键),parent_id(该记录的父亲id),比如我们要从某1个id往下找他所有的儿子还有孙子(这时候心里要有一颗树的形象),该怎么写? WITH RECURSIVE cat AS ( SELECT * FROM

先声明,瞎猜的,个人理解,不一定对。

递归查询大家都知道,常见的如一张表,包含id(主键),parent_id(该记录的父亲id),比如我们要从某1个id往下找他所有的儿子还有孙子(这时候心里要有一颗树的形象),该怎么写?

WITH RECURSIVE cat AS (
    SELECT
        *
    FROM
        category A
    WHERE
        A . ID = 1
    UNION ALL
        SELECT
            fz.*
        FROM
            category fz
        INNER JOIN cat ON fz. parent_id = cat.id
) SELECT
    *
FROM
    cat;

解释一下(注意RECURSIVE关键字):

  1. 执行子查询SELECT * FROM category A WHERE A . ID = 1(UNION
    ALL之前的部分),这个作为起点

  2. 执行外层 select * from cat(把AS后面的子查询整体当作cat),这时候因为已经有id等于1的记录了,所以能查到1条记录

  3. 执行子查询中union all后面的部分,即:select fz.* from category fz INNER JOIN cat
    on fz.parent_id= cat.id,因为已经有1条记录,即 cat.id = 1,所以此时该语句就变成select
    fz.* from category fz INNER JOIN cat on fz.parent_id =
    1,也就是找parent_id(就是父亲啦)等于1的记录,换句话说,就是在fz中找id=1的记录的儿子记录

  4. 假如第3步找到了多条记录(大于0,否则记录数为0就结束了),假设有1条记录,设该记录为r1。重复执行步骤2和3,只是这里执行第2步的时候,从cat中选出的记录为r1.id;执行第3步,就变成了:select
    fz.* from category fz INNER JOIN cat on fz.parent_id=
    r1.id,就变成了找r1的儿子记录

  5. 如果第4步返回多条记录,类似啦,反正递归嘛

  6. 如此,自顶向下,一棵树就出来了

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读