SQL Server:构建有效树过滤无效分支 [英] SQL Server : build valid tree filtering invalid branches

查看:35
本文介绍了SQL Server:构建有效树过滤无效分支的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含以下数据的表格:

I have a table with following data:

ID     ParentID    Name
-----------------------
 1       NULL      OK1
 2        1        OK2
 3        2        OK3
 5        4        BAD1
 6        5        BAD2

所以我只需要取那些链接到 ParentID = NULL 或这些行的有效子行的行(即:OK3 是有效的,因为它链接到 OK2,后者链接到 OK1,链接到NULL,这是有效的.)

So I need to take only those lines, which are linked to ParentID = NULL OR valid children of such lines (i.e: OK3 is valid because it's linked to OK2, which is linked to OK1, which is linked to NULL, which is valid.)

但是 BAD1 和 BAD 2 是无效的,因为它们没有链接到一行,而行链接到 NULL.

But BAD1 and BAD 2 are not valid because those are not linked to a line, which is linked to NULL.

我想出的最佳解决方案是过程 + 函数.并且函数被调用的次数与表中的最大链接级别数相同.

The best solution I figured out is a procedure + function. And function is called as many times as the max number of link levels in the table.

有人可以为此类任务提出更好的解决方案吗?

Can anybody suggest better solution for such task?

推荐答案

您需要的只是爱和基本的 递归 CTE :-)

All you need is love, and a basic recursive CTE :-)

创建并填充示例数据(在以后的问题中保存我们这一步):

Create and populate sample data (Please save us this step in future questions):

DECLARE @T as table
(
    ID int,
    ParentID int,
    Name varchar(4)
)

INSERT INTO @T VALUES
(1, NULL, 'OK1'),
(2, 1, 'OK2'),
(3, 2, 'OK3'),
(5, 4, 'BAD1'),
(6, 5, 'BAD2')

CTE 和查询:

;WITH CTE AS
(
    SELECT ID, ParentId, Name
    FROM @T 
    WHERE ParentId IS NULL

    UNION ALL

    SELECT T1.ID, T1.ParentId, T1.Name
    FROM @T T1
    INNER JOIN CTE T2 ON T1.ParentID = T2.ID
)

SELECT *
FROM CTE 

结果:

ID          ParentId    Name
----------- ----------- ----
1           NULL        OK1
2           1           OK2
3           2           OK3

这篇关于SQL Server:构建有效树过滤无效分支的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆