通过仅重建您想要的树的一部分来加速 T-SQL CTE?

Speed up T-SQL CTE by rebuilding only part of the tree you want?

我有一个非常简单的 table 一个 ParentID (int) 和 ChildID (int)。问题是它有几千行长,许多 ChildID 是其他 ParentID 的 ParentID。

我感兴趣的是构建所有这些共享 ID 的层次结构。但是,有些分支可能只有 2 或 3 层深,而其他分支可能有 30 多层深。

虽然所有数据都很重要,但只有某些分支(及其 sub-branches)在特定时间很重要。

我最初的尝试是 'bruteforce' 它并构建整个树,但它的效率非常低且资源密集。

因此,我想知道如何调整我的基本 simple/standard CTE(使用前面提到的只有两个整数列的简单 table)来选择这个非常复杂的树的特定分支并递归地构建我想要的分支的层次结构到它的最远点,而不必构建树的其余部分及其所有分支。

这可能吗?

作为旁注 - 由于数据量巨大,加上它只是数字数据的简单性,我无法猜测某个分支之后会发生什么(即,没有顺序编号或任何东西提供提示,基本上任何东西都可能超出我想要的分支我知道我需要从所有数据中提取,我只是不想浪费 time/resources 构建我不需要的分支)。

编辑:这是我的示例代码:

;WITH CTE
AS (
Select ChildID
    ,ParentID
    ,cast(ParentID as varchar(max)) as IDpath
From #TempTable

UNION ALL

Select B.ChildID
    ,B.ParentID
    ,cast(B.ParentID as varchar(max)) + '>' + A.IDpath as IDpath
From CTE A
    Inner Join #TempTable B on A.ParentID=B.ChildID
)
Select Distinct IDpath
From CTE
Where IDpath is not null

就数据而言,parent ID和child ID是1-10,000之间的整数。有些 parent 有 children,有些没有(在这些情况下 ChildID 为空)。

所以我的输出看起来像:

ParentID>ID>ID>ID>ID>ID>ChildID(中间的 ID 是他们 parent 的 children,然后是他们的 parent随后 child 等等)。

所以这是我用来解决我的问题以选择 ID 的代码,编号 2220 是我的 "trunk" 路径,我能够通过所有 Parent/Child 映射这个 ID ID 指向层次结构分支中最远的叶子。

现在我根本不是 SQL 编码方面的专家。坦率地说,我什至不擅长它,所以这可能不是解决问题的最佳方法(甚至不是一个完整的解决方案,但考虑到我对结果的期望,它似乎对我有用)。

现在,如果 2220 不是另一个 ParentID 的 ChildID,我不确定这是否可行。稍后我可能会对此进行测试,但就目前而言,我正在获取所需的数据。但是,如果这最终成为问题,我总是可以进行检查并将其作为 ChildID 插入,ParentID 为 0(因为我知道我所有的 ID 都是正整数)。

无论如何,这就是我更改代码以使其适用于我的方式:

;WITH CTE
AS (
Select 1 as Level
    ,ChildID
    ,ParentID
    ,cast(ChildID as varchar(max)) as IDpath
From #TempTable

UNION ALL

Select Level + 1 as Level
    ,B.ChildID
    ,B.ParentID
    ,A.IDpath + '>' + cast(B.ChildID as varchar(max)) as IDpath
From CTE A
    Inner Join #TempTable B on A.ChildID=B.ParentID
Where Level = 1
    or (Level > 1 and IDpath like '2220%')
)
Select Distinct IDpath
From CTE
Where left(IDPath,4) = '2220'

现在,如果有专家可以评论此 "fix" 的质量并且合理(或者我遗漏了什么),我将不胜感激。我不想因为我天真地认为这是一个很好(足够)的修复而意外地用垃圾修复毒害大众。