1. 程式人生 > 其它 >對SQL CTE的一點個人理解

對SQL CTE的一點個人理解

/*
執行順序:

首先,執行按一、二,此時二輸出的結果,可以理解為臨時n

然後,按三、二、三、二迴圈執行

注意:
,步驟三的where為遞迴終止條件,由於用的是substr函式。在最後一次遞迴的時候,如果不加限制,給的substr的起始位置會大於字串長度導致報錯
,步驟三的from為CTE臨時表,在開始遞迴的時候,需要動態獲取迴圈截斷的三個條件。
,關鍵字 union all 下面為每次遞迴的語句,遞迴資料集必為CTE的臨時表n
*/

 1 WITH n --下面括號內的為遞迴用的引數
 2 ( str --需要分割的字串
 3 , ori --截斷的位置,隨每次遞迴增加
 4 , pos --下一次substr擷取到的位置,
5 ) 6 AS 7 ( 8 ---------執行步驟一 ------------------------ 9 select dept_lid as str 10 ,1 11 ,locate(',',dept_lid) 12 from pacs.PACSIE_USER_TBL a where user_id='11077' 13 union all 14 ---------執行步驟三 ------------------------ 15 select str 16 ,pos + 1 17 ,locate(',',str,pos+1) 18 from n 19 WHERE locate ('
,', str, pos + 1) > 0 20 ) 21 ---------執行步驟二 ------------------------ 22 SELECT substr (str, ori, pos - ori) AS RESULT 23 FROM n

-----------------------實質就是將步驟一的結果,迴圈帶入步驟三執行。步驟二隻做每次遞迴後的輸出用途。

--執行邏輯如下

引用:https://www.cnblogs.com/heyu/articles/11324767.html

 1     SELECT c.CategoryId,c.Name,c.Parent,tt.level
+1 level FROM Category c JOIN 2 ( 3 SELECT c.CategoryId,c.Name,c.Parent,tt.level+1 level FROM Category c JOIN 4 ( 5 SELECT c.CategoryId,c.Name,c.Parent,tt.level+1 level FROM Category c JOIN 6 ( 7 SELECT CategoryId,Name,Parent,0 level FROM dbo.Category WHERE CategoryId=46 8 9 )tt ON tt.Parent=c.CategoryId 10 )tt ON tt.Parent=c.CategoryId 11 )tt ON tt.Parent=c.CategoryId