我對Postgresql遞迴查詢的理解

王春浩troy發表於2016-08-02

先宣告,瞎猜的,個人理解,不一定對。

遞迴查詢大家都知道,常見的如一張表,包含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. 如此,自頂向下,一棵樹就出來了

相關文章