sql - 递归地从同一个表父子表中获取最后一条记录

标签 sql sql-server sql-optimization

我想从同一个表中获取最后的引用 ID。我有下表。

 ID   UserId   DelegatedToUserId
 1      100       101
 2      101       102
 3      102       103
 4      103       NULL
 5      104       109

我实在是想不起来。我知道我想要什么,只是无法将其显示在屏幕上。因此,当我询问 100 查询时应返回 103,当我再次询问 101 或 102 时,应返回 103。当用户输入 104 时,应返回 109

当我请求 103 时,它应该返回 103,因为没有委托(delegate)。

这可以在单个 SQL 查询中完成吗?

最佳答案

can this be done in single sql query ?

如果您不知道层次结构可以达到哪一级,则需要使用递归CTE。如果只是 1 或 2 级,您可以在单个查询中无需递归 CTE 来完成。

您可以使用如下所示的递归CTE来获得所需的输出。

;WITH mytest 
     AS (SELECT P.userid, 
                P.delegatedtouserid, 
                1 AS LVL 
         FROM   @table P 
         WHERE  userid = 100 
         UNION ALL 
         SELECT P1.userid, 
                P1.delegatedtouserid, 
                M.lvl + 1 AS LVL 
         FROM   @table P1 
                INNER JOIN mytest M 
                        ON M.delegatedtouserid = P1.userid) 

SELECT TOP 1 WITH ties * 
FROM   mytest 
ORDER  BY Row_number() OVER (ORDER BY lvl DESC); 

注意:将 @table 替换为您的实际表名称。

Online Demo

关于sql - 递归地从同一个表父子表中获取最后一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55353807/

相关文章:

mysql - 如何使用一列创建多条记录?

sql - 提高大型表上的 SQL Server 查询性能

sql-server - SQL Server 2005 事务日志条目 : LOP_Format_Page

mysql - 是否可以进一步优化这些查询?

sql - 公共(public)架构未在安全定义器函数的搜索路径中定义,但仍可访问

mysql - 一段时间内每个用户的 SQL 平均请求数

javascript - 通过 Javascript 调用在 php 上获取 Ajax POST 数据

mysql - PHPMYAdmin 链接表/列

sql - 是否执行SQL View 中未选择的列?

postgresql - 优化 PostgreSQL 中串联名字和姓氏的搜索