sql - 您如何获得递归 CTE 中生成的最后一条记录?

标签 sql sql-server recursion common-table-expression

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

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 看起来像这样:
ParentID    CustID
5            5
1            8
5            4
4            1

我从上面的代码得到的结果是:
ParentID    CustID
4            1
5            4
5            5

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

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

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

最佳答案

如果你只是想要最高的递归深度,你不能做这样的事情吗?那么,当你实际查询 CTE 时,只查找具有 max(Depth) 的行?像这样:

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 一起使用:
select top 1 * from CTELevelone order by Depth desc

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

关于sql - 您如何获得递归 CTE 中生成的最后一条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35320/

相关文章:

sql - 带有 IN (DB LINK) 和本地约束的 WHERE 子句 : slow query

c# - Azure 移动服务登录数据库和 "master"用户时出现错误

java - 如何修复递归字符串检查

swift - 具有基于递归关系的条件的 NSPredicate - Swift - 核心数据

Javascript递归不遍历链

php - Mysql创建排序索引性能简单频繁查询

sql - 代码错误。未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式

java - 从 jTextField Java 获取 SQL 表名称

sql-server - SSIS 2014 和 Postgres ODBC 的连接泄漏问题

sql - 形成查询以查找重复的邮政编码