我對Postgresql遞歸查詢的理解

先聲明,瞎猜的,我的理解,不必定對。code

遞歸查詢你們都知道,常見的如一張表,包含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關鍵字):io

  1. 執行子查詢SELECT * FROM category A WHERE A . ID = 1(UNION
    ALL以前的部分),這個做爲起點select

  2. 執行外層 select * from cat(把AS後面的子查詢總體看成cat),這時候由於已經有id等於1的記錄了,因此能查到1條記錄nio

  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的兒子記錄co

  5. 若是第4步返回多條記錄,相似啦,反正遞歸嘛

  6. 如此,自頂向下,一棵樹就出來了

相關文章
相關標籤/搜索