SQL - CTE Recursive (遞迴)

  • 7366
  • 0
  • SQL
  • 2015-03-25

摘要:SQL - CTE Recursive (遞迴) & how is SQL CTE Run

花了些時間找SQL Recursive的使用,並且搜尋到國外研究了一下SQL Recursive

如何執行的流程。 最近心得:SQL寫得好,程式短短以行就解決了。

對SQL的挑戰,我真的覺得自己是在越級打怪,瞬間就跳到這步,說真的對於寫程式寫久的我

忽然工作重心移往SQL的時候,不適應的感覺超大(由此可知之前SQL的程度有多差)

 

這次分享的是SQL CTE Recursive,一開始連CTE都不知道就直接跳入SQL的遞迴,

 

【統計某個節點下所以子節點數】

基本資料如下

 

希望呈現的結果如下

 

希望能達到計算在ID=1的這個跟結點下,該節點下所有的子節點(ID= 子節點的.ParentID)

同理該子節點的子節點也能計算的出,這時就會使用到Recursive(遞迴)

 

 【解決方式】

WITH node AS

(

SELECT id,parentid,num FROM testtable

WHERE parentid = 0 UNION ALL

SELECT tb1.id,tb1.parentid,tb1.num FROM testtable TB1


INNER JOIN node TB2
 

ON TB1.parentid = TB2.id

)
--select * from node
SELECT tb1.id,Count(TB2.id) AS subnode FROM node TB1
LEFT JOIN testtable TB2 ON TB1.id = TB2.parentid
GROUP BY TB1.id

 

 

也許有人和我一樣,不想要死學程式,想知道Recursive 的執行過程

其實上述的過程真的花了不少時間才理解,Recursive這段的執行就等同於如下

看完如下的執行過程,應該很多人會和我一樣有恍然大悟的感覺。

 

WITH row1 AS (

SELECT *
FROM testtable
WHERE parentid = 0

),
row2 AS (

SELECT * FROM testtable WHERE parentid = 1

),
row3 AS (

SELECT *
FROM testtable
WHERE parentid IN ( 2, 3, 4, 8 )

),
row4 AS (

SELECT * FROM testtable WHERE parentid IN ( 5, 6 )

)

SELECT * FROM row1
UNION ALL
SELECT * FROM row2
UNION ALL
SELECT * FROM row3
UNION ALL
SELECT * FROM row4