T-SQL层次查询

T-SQL hierarchy query(T-SQL层次查询)
本文介绍了T-SQL层次查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含分层数据的表: 这是一个包含id、父代id、名称、代码(有时不填充)、Level和isroot列的数据示例。在实际场景中,将有更多的级别,而不仅仅是2个级别,但现在让我们来看一下简化的示例。

我需要做的是遍历所有记录,并在层次结构的任何级别找到id未填充的行:

  • ID范围为6到10的行应返回,因为它们在层次结构的任何点都没有填充代码
  • 不应返回从%1到%5的行,因为层次结构中的某个位置提到了代码。

如何使用T-SQL解决此问题?

我想到的唯一解决方案是递归(CTE或While),但我发现我尝试实现的解决方案太复杂,无法解决问题。

推荐答案

与@DhruvJoshi的答案略有不同,因为它可能有用:

WITH recCTE AS
(
    SELECT 
        id, 
        parent_id, 
        CASE WHEN CODE IS NOT NULL THEN 1 ELSE 0 END as code_check,
        1 as depth,
        CAST(id as VARCHAR(50)) as path
    FROM table
    WHERE isRootLevel = 1
    UNION ALL
    SELECT
        table.id,
        table.parent_id,
        CASE WHEN CODE IS NOT NULL OR reccte.code_check = 1 THEN 1 ELSE 0 END,
        depth + 1 as depth,
        reccte.path + CAST(table.id AS varchar(10)) as path
    FROM
        recCTE 
        INNER JOIN table ON
            recCTE.ID = table.parent_id
    WHERE depth < 20 /*just in case you start cycling/endless looping*/
)
SELECT * FROM recCTE where code_check = 0 ORDER BY path, depth;

这篇关于T-SQL层次查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
SSIS: Model design issue causing duplications - can two fact tables be connected?(SSIS:模型设计问题导致重复-两个事实表可以连接吗?)
SQL Server Graph Database - shortest path using multiple edge types(SQL Server图形数据库-使用多种边类型的最短路径)
Invalid column name when using EF Core filtered includes(使用EF核心过滤包括时无效的列名)
How should make faster SQL Server filtering procedure with many parameters(如何让多参数的SQL Server过滤程序更快)
How can I generate an entity–relationship (ER) diagram of a database using Microsoft SQL Server Management Studio?(如何使用Microsoft SQL Server Management Studio生成数据库的实体关系(ER)图?)