sqlserver递归查询示例
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sqlserver递归查询⽰例
⽰例题⽬:
有⼀张表T0617,⾥⾯的数据如下:
希望得到如下结果
该如何写这个查询?
⽰例数据:
CREATE TABLE T0617
(ID INT,
PID INT
)
INSERT INTO T0617 VALUES
(1,0),(2,1),(3,2),(4,3)
查询sql:
WITH CTE AS (
SELECT ID,PID,CAST(ID AS VARCHAR(1000)) AS PATH
FROM T0617
WHERE ID =1
UNION ALL
SELECT A.ID,A.PID,CAST ((CTE.PATH +'->'+CAST(A.ID AS VARCHAR(10))) AS VARCHAR(1000)) AS PATH
FROM T0617 A
INNER JOIN CTE ON A.PID = CTE.ID
)
SELECT*FROM CTE
思路解析:
with as语句官⽅定义:指定临时命名的结果集,这些结果集称为公⽤表表达式 (CTE)。
公⽤表表达式可以包括对⾃⾝的引⽤。
这种表达式称为递归公⽤表表达式。
通俗理解,with as语句为⼦查询部分,可以定义⼀个sql⽚段,该⽚段可以被整个sql语句使⽤,并且with as语句具体可以对⾃⾝引⽤的特性,利⽤该特性可以实现递归查询。
递归sql解析:递归查询需要包含两个部分,上半部分为定位点,下半部分与公⽤表表达式⾃⾝进⾏关联查询。
⽐如第⼀次循环的时候只查询出上半部分,第⼆次循环的时候,下半部分与第⼀次循环的结果进⾏关联查询,第三次与第⼆次的结果进⾏关联,以此类推,直到⽆法找到与上⼀次结果进⾏关联时停⽌。