T-SQL层次查询

本教程将介绍T-SQL层次查询的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

T-SQL层次查询 教程 第1张

问题描述

我有一个包含分层数据的表:

这是一个包含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层次查询的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。