先宣告,瞎猜的,個人理解,不一定對。
遞迴查詢大家都知道,常見的如一張表,包含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關鍵字):
-
執行子查詢SELECT * FROM category A WHERE A . ID = 1(UNION
ALL之前的部分),這個作為起點 -
執行外層 select * from cat(把AS後面的子查詢整體當作cat),這時候因為已經有id等於1的記錄了,所以能查到1條記錄
-
執行子查詢中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的記錄的兒子記錄 -
假如第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的兒子記錄 -
如果第4步返回多條記錄,類似啦,反正遞迴嘛
-
如此,自頂向下,一棵樹就出來了