sql - CTE-- 获取父级

标签 sql sql-server

我知道有很多关于 CTE 的问题,但我仍然不知道该怎么做。 我有表 Messages,其中包含以下列:id 和 previousMessageId。我怎样才能获得 id = 957 的父级 - 它应该是:950。

table Messages
--------------
id  | previousMessageId
957 | 956
956 | 950
950 | NULL

这是我的查询:

WITH previous AS 
( 
    SELECT id  
    FROM Messages 
    WHERE id = 957 

    UNION ALL 

    SELECT cur.id 
    FROM Messages cur
    INNER JOIN previous ON cur.previousMessageID = previous.id
) 
SELECT * FROM previous 

它给了我:

957
958

但结果应该是:950

最佳答案

您可以尝试如下。

declare @table table(id int,   previousMessageId int)
insert into @table select 957 , 956
insert into @table select 956 , 950
insert into @table select 950 , NULL
insert into @table select 999 , 998
insert into @table select 998 , 997
insert into @table select 997 , NULL

;WITH previous 
     AS (SELECT id, 
                previousmessageid 
         FROM   @table 
         WHERE  id = 957
         UNION ALL 
         SELECT cur.id, 
                cur.previousmessageid 
         FROM   @table cur 
                INNER JOIN previous 
                        ON cur.id = previous.previousmessageid) 
SELECT ID 
FROM   previous 
WHERE  previousmessageid IS NULL 

在上面的示例中,对于 Id 957,您将获得 950,对于 Id 999,您将获得 997

关于sql - CTE-- 获取父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54691340/

相关文章:

sql - 从数据库中的列值生成直方图

sql-server - SQL Server相关表主键由GUID改为BigInt的方法

sql-server - 从 Azure 流分析将数据插入 Azure SQL 数据库表时出现“OutputDataConversionError.TypeConversionError”

sql-server - SQL Server 配置文件 - 查看参数值?

sql - mysql中的if子句

mysql - 如何从表中检索学生信息?

mysql - 保护特定对象 ID 不被 MySQL 删除

c# - Dapper ORM - 插入具有现有 ID 的对象

sql - 如何从前 50 名中随机选择 8 首具有唯一 user_id 的歌曲?

mysql - 从MySQL中的多点数据类型获取点数组(lat,lng)