1. 程式人生 > >2017.12.07 postgresql使用with recursive完成迭代查詢

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,為向下查詢。