2017.12.07 postgresql使用with recursive完成迭代查詢

1.表結構

 

2.需求

查詢某條記錄的所有父親節點,或者所有孩子節點。

 

3.向上查詢(查詢所有父親節點)

 注意,這裏返回的記錄包含自己。

sql如下:

1 WITH RECURSIVE res AS (
2   SELECT t1.* FROM t_code as t1  
3   WHERE t1.enable = 'true' and t1.id = '4'
4 
5   UNION 
6     SELECT t2.* from t_code as t2
7     INNER JOIN res as t3 ON t2.id = t3.parent_id
8     WHERE t2.enable = 'true'
9 )SELECT res.* from res

 

返回結果:

 

4.向下查詢(查詢所有孩子節點)

注意,這裏返回的記錄包含自己。

和上面的sql只有一個差別:

1 INNER JOIN res as t3 ON t3.id = t2.parent_id

 

sql如下:

1 WITH RECURSIVE res AS (
2   SELECT t1.* FROM t_code as t1  
3   WHERE t1.enable = 'true' and t1.id = '1'
4 
5   UNION 
6         SELECT t2.* from t_code as t2
7     INNER JOIN res as t3 ON t3.id = t2.parent_id
8     WHERE t2.enable = 'true'
9 )SELECT res.* from res

 

返回結果:

 

綜上所述,可以將這段sql看做三個部分組成:(1)初始條件。(2)迭代條件。(3)將結果作爲下一個迭代的初始條件。

其中迭代條件中,寫作 INNER JOIN res as t3 ON t3.id = t2.parent_id 時,是表示上一次查詢的結果(t3)是此時查詢記錄(t2)的父親。即始終是用parent來查詢children,爲向下查詢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章