先聲明,瞎猜的,我的理解,不必定對。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
執行子查詢SELECT * FROM category A WHERE A . ID = 1(UNION
ALL以前的部分),這個做爲起點select
執行外層 select * from cat(把AS後面的子查詢總體看成cat),這時候由於已經有id等於1的記錄了,因此能查到1條記錄nio
執行子查詢中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的兒子記錄co
若是第4步返回多條記錄,相似啦,反正遞歸嘛
如此,自頂向下,一棵樹就出來了