Label(IdLabel int,IdParentLabel int,name varchar(30))

Insert Into Label Values (1, null, 'root')
Insert Into Label Values (2, 1, 'child1')
Insert Into Label Values (3, 1, 'child2')
Insert Into Label Values (4, 1, 'child3')
Insert Into Label Values (5, 2, 'grandchild1')
Insert Into Label Values (6, 3, 'grandchild2') 
Insert Into Label Values (7, 4, 'grandchild3') 
Insert Into Label Values (8, 5, 'grandgrandchild1') 
Insert Into Label Values (9, 5, 'grandgrandchild2') 

我想要编写一个存储过程,它将接受@IdLabel作为输入参数,并将返回最顶层父代的IdLabel(最顶层父代的定义:分支中根的下一个子代,因此根永远不会被视为顶层父代),但它总是返回作为父代的根.

示例:

  • Exec StoredProcedure 8将返回2,因为它是下一个子级
  • Exec StoredProcedure 9也返回2
  • Exec StoredProcedure 6将返回3

以下是存储过程:

CREATE PROCEDURE CheckParent
    @IdLabel int
AS
BEGIN
    DECLARE @TopParent int
    
    SELECT @TopParent = IdParentLabel
    FROM Label
    WHERE IdLabel = @IdLabel
    
    WHILE @TopParent IS NOT NULL AND @TopParent <> 1
    BEGIN
        SET @IdLabel = @TopParent
        
        SELECT @TopParent = IdParentLabel
        FROM Label
        WHERE IdLabel = @IdLabel
    END
    
    IF @TopParent IS NULL
    BEGIN
        SELECT @TopParent = IdLabel
        FROM Label
        WHERE IdParentLabel IS NULL AND IdLabel <> 1
        ORDER BY IdLabel
        OFFSET 0 ROWS
        FETCH NEXT 1 ROWS ONLY
    END
    
    SELECT @TopParent AS TopParent
END

推荐答案

我不确定您为什么要使用循环架构,例如,您可以使用CTE的内置递归特性来执行这种类型的任务

declare @IdLabel int = 9;

with p as (
    select IdLabel, IdParentLabel
    from label
    where idLabel = @IdLabel
    union all
    select l.IdLabel, l.IdParentLabel
    from Label l
    join p on l.IdLabel = p.IdParentLabel
    where l.idParentLabel is not null
)
select top(1) idLabel
from p
order by IdParentLabel;

Sql相关问答推荐

在postgresql中使用来自另一个字段的日期名称作为JSONB查询中的关键字

帮助修复查询以识别SQL DW中数据中的递归关系

在多个柱上连接时,如何确定连接条件?

Postgres:对包含数字的字符串列表进行排序

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

BigQuery-当子查询不返回任何结果时,所有结果为零

Ffltter&;Dart SQL Lite包:是否可以在一个查询中执行多条更新语句(每次执行不同的WHERE参数)

按日期时间(不包括秒)连接表

基于另一个(SAS、SQL)中的值更新列

Postgres jsonpath运算符的变量替换,如_regex?

VS代码无法识别SQL代码中带括号的字符串

将SQL Server查询改进为;线程安全;

错误:postgresql 中缺少表评级的 FROM 子句条目

正则表达式:停在第一个匹配的其中一个字符位置上

使用给定的变量对在循环中执行更新语句

PostgreSQL - 递归地聚合来自不同列的属性

在 postgresql 中,我可以将其组合成一个查询吗?

运算符不存在:integer = bigint[]

从 JSON 数组中移除对象

在 MindsDB SQL 编辑器中运行 PostgreSQL 条目 ID 时出现未知 Select 目标错误