sqlserver递归查询示例

示例题目:

有一张表T0617,里面的数据如下:

sqlserver递归查询示例

希望得到如下结果

sqlserver递归查询示例

该如何写这个查询?

示例数据:

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解析:递归查询需要包含两个部分,上半部分为定位点,下半部分与公用表表达式自身进行关联查询。比如第一次循环的时候只查询出上半部分,第二次循环的时候,下半部分与第一次循环的结果进行关联查询,第三次与第二次的结果进行关联,以此类推,直到无法找到与上一次结果进行关联时停止。

sqlserver递归查询示例

上一篇:jdbctemplate update 执行又返回值,没报错吗,但是数据库没有添加新数据


下一篇:PostgreSQL 密码验证功能增强