您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

sqlserver递归查询示例

bubuko 2022/1/25 19:03:01 sqlserver 字数 5301 阅读 988 来源 http://www.bubuko.com/infolist-5-1.html

示例题目: 有一张表T0617,里面的数据如下: 希望得到如下结果 该如何写这个查询? 示例数据: CREATE TABLE T0617 (ID INT, PID INT ) INSERT INTO T0617 VALUES (1,0),(2,1),(3,2),(4,3) 查询sql: WITH C ...

示例题目:

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

sqlserver递归查询示例

原文:https://www.cnblogs.com/SQLPLUS/p/14892893.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶