关于sql:如何获取递归CTE中生成的最后一条记录?

关于sql:如何获取递归CTE中生成的最后一条记录?

How do you get the last record generated in a recursive CTE?

在下面的代码中,我在SQL Server 2005中使用递归CTE(公用表表达式)来尝试查找基本层次结构的顶级父级。 此层次结构的规则是,每个CustID都有一个ParentID,如果CustID没有父级,则ParentID = CustID,它是最高级别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DECLARE @LookupID INT

--Our test value
SET @LookupID = 1

WITH cteLevelOne (ParentID, CustID) AS
(
        SELECT   a.ParentID, a.CustID
        FROM     tblCustomer AS a
        WHERE    a.CustID = @LookupID
    UNION ALL
        SELECT   a.ParentID, a.CustID
        FROM     tblCustomer AS a
        INNER JOIN cteLevelOne AS c ON a.CustID = c.ParentID
        WHERE c.CustID <> a.CustomerID
)

因此,如果tblCustomer如下所示:

1
2
3
4
5
ParentID    CustID
5            5
1            8
5            4
4            1

我从上面的代码中得到的结果是:

1
2
3
4
ParentID    CustID
4            1
5            4
5            5

我想要的只是该结果的最后一行:

1
2
ParentID    CustID
5            5

如何返回CTE中生成的最后一条记录(这将是最高级别的CustID)?

另请注意,此表中有多个不相关的CustID层次结构,因此我不能只执行SELECT * FROM tblCustomer WHERE ParentID = CustID。 我无法按ParentID或CustID排序,因为ID号与它在层次结构中的位置无关。


如果您只想获得最高的递归深度,就不能这样做吗?那么,当您实际查询CTE时,只需查找具有max(Depth)的行?像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE @LookupID INT

--Our test value
SET @LookupID = 1;

WITH cteLevelOne (ParentID, CustID, Depth) AS
(
        SELECT   a.ParentID, a.CustID, 1
        FROM     tblCustomer AS a
        WHERE    a.CustID = @LookupID
    UNION ALL
        SELECT   a.ParentID, a.CustID, c.Depth + 1
        FROM     tblCustomer AS a
        INNER JOIN cteLevelOne AS c ON a.CustID = c.ParentID
        WHERE c.CustID <> a.CustID
)
SELECT * FROM CTELevelone WHERE Depth = (SELECT MAX(Depth) FROM CTELevelone)

或者,根据trevor的建议,可以与同一CTE一起使用:

1
SELECT top 1 * FROM CTELevelone ORDER BY Depth DESC

我认为,在描述的情况下,CustomerID不一定是您想要订购的东西,但是我也不十分清楚这个问题。


我不确定我是否完全理解该问题,但是可以尝试一下:

1
SELECT TOP 1 FROM cteLevelOne ORDER BY CustID DESC

假定CustID也与示例中的顺序相同,而不是类似于GUID。


首先,如果任何父子相同,则不会完成cte。由于它是递归CTE,因此必须终止。如果Parent和cust id相同,则循环不会结束。

消息530,第16层,状态1,第15行
声明终止。在语句完成之前,最大递归100已用尽。


推荐阅读

    linux命令查找内容?

    linux命令查找内容?,命令,文件,网络,名称,信息,工作,标准,系统,管理,位置,lin

    linux上获取网管命令?

    linux上获取网管命令?,地址,系统,网络,信息,电脑,服务,网关,状态,名字,中心,l

    linux命令行获取ip?

    linux命令行获取ip?,地址,系统,代码,信息,电脑,服务,状态,密码,命令,网卡,【L

    linux查找包的命令?

    linux查找包的命令?,基础,软件,项目,数据,名称,命令,环境,技术,文件,子目录,

    linux命令获取主机名?

    linux命令获取主机名?,工作,地址,管理,系统,信息,命令,目录,软件,代码,策略,L

    linux中递归压缩命令?

    linux中递归压缩命令?,系统,工作,命令,工具,管理,信息,设备,文件,目录,常用

    linux获取网速命令?

    linux获取网速命令?,网络,工具,软件,地址,设备,5G,名称,工作,通讯,分析,linux

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux查找权限命令?

    linux查找权限命令?,系统,地址,工作,命令,文件,信息,概念,时间,标准,权限,Lin

    linux查找和替换命令?

    linux查找和替换命令?,工作,系统,数据,字符串,文件,命令,实时,管理,首次,信

    linux命令查找内存?

    linux命令查找内存?,情况,系统,信息,工具,状态,分析,数字,内存,命令,适当,怎

    linux查找文件名命令?

    linux查找文件名命令?,系统,信息,工具,命令,文件,字符串,样式,管道,文本,动

    linux命令查找顺序?

    linux命令查找顺序?,时间,地址,工作,命令,系统,文件,本行,灵活,标准,信息,Lin

    linux里面查找命令?

    linux里面查找命令?,系统,数据,信息,命令,工作,情况,名称,标准,时间,灵活,lin

    linux命令获取时分秒?

    linux命令获取时分秒?,时间,系统,体系,标准,命令,工具,管理,国家,大陆,信息,l

    linux查找行命令行?

    linux查找行命令行?,系统,首页,命令,文件,终端,工具,环境,信息,名称,百度,lin

    查找文本的linux命令?

    查找文本的linux命令?,工具,命令,信息,系统,标准,文件,终端,情况,内容,字符

    linux命令获取机器码?

    linux命令获取机器码?,地址,设备,工作,信息,命令,管理,系统,工具,目录,网络,l

    linux查找名字命令?

    linux查找名字命令?,系统,地址,密码,工作,名字,命令,信息,标准,灵活,目录,lin

    linux查找命令的文职?

    linux查找命令的文职?,标准,位置,系统,名称,命令,文件,文件名,灵活,名字,目