示例题目:
有一张表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语句,即公用表表达式。官方文档地址:https://docs.microsoft.com/zh-cn/sql/t-sql/queries/with-common-table-expression-transact-sql?view=sql-server-ver15
with as语句官方定义:指定临时命名的结果集,这些结果集称为公用表表达式 (CTE)。 公用表表达式可以包括对自身的引用。 这种表达式称为递归公用表表达式。
通俗理解,with as语句为子查询部分,可以定义一个sql片段,该片段可以被整个sql语句使用,并且with as语句具体可以对自身引用的特性,利用该特性可以实现递归查询。
递归sql解析:递归查询需要包含两个部分,上半部分为定位点,下半部分与公用表表达式自身进行关联查询。比如第一次循环的时候只查询出上半部分,第二次循环的时候,下半部分与第一次循环的结果进行关联查询,第三次与第二次的结果进行关联,以此类推,直到无法找到与上一次结果进行关联时停止。