【问题标题】:Recursive Query on Single Table单表递归查询
【发布时间】:2024-05-23 18:35:01
【问题描述】:

我有一个遵循以下结构的表;

Tablename: Codes
ID int
CodeID int
ParentID int
Name varchar

是否有可能在 MSSQL 2012 中在 CTE 中执行查询以递归选择所有值?

如果 CodeID = NULL,则这是代码的根。当您向下一个步骤时,ParentID 将与 CodeID 相关。

例如,从 ID = null AND ParentID = X 的代码中选择名称

提前致谢。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    递归地选择所有值是什么意思?以下选择所有值:

    select *
    from codes;
    

    让我假设您想要层次结构中所有代码的所有祖先。您可以使用递归 CTE 来做到这一点:

    with cte as (
          select c.id, c.codeid, c.parentid, c.name,
                 cast(c.id as varchar(255)) as ids
          from Codes c
          union all
          select cte.id, cte.codeid, c.parentid, cte.name,
                 cast(cte.ids +','+cast(c.parentid as varchar(255)) as varchar(255))
          from cte join
               Codes c
               on cte.parentid = c.id and c.parentid is not null and
                  ','+cast(cte.parentid as varchar(255))+',' not like '%,'+ids+'%,'
        )
    select *
    from cte;
    

    您可以针对特定的父 id 对此进行过滤,以获取其下的所有节点。

    Here 是一个显示工作版本的 SQL Fiddle。

    【讨论】: