摘要: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