Sql server 需要SQL server中特定父记录的整个子记录链
我们希望根据SQL Server的ID获取特定记录的总树结构(下链) 这是我的数据表结构:Sql server 需要SQL server中特定父记录的整个子记录链,sql-server,database,parent-child,Sql Server,Database,Parent Child,我们希望根据SQL Server的ID获取特定记录的总树结构(下链) 这是我的数据表结构: ----------------------------------------------------------------- CHILD_CODE PARENT_CODE CHILD_RANK PARENT_RANK ----------------------------------------------------------------- 1
-----------------------------------------------------------------
CHILD_CODE PARENT_CODE CHILD_RANK PARENT_RANK
-----------------------------------------------------------------
1 Null 1 Null
2 1 2 1
3 1 2 1
4 1 2 1
5 2 3 2
6 2 3 2
7 3 3 2
8 5 4 3
在这里,我需要有一个家长的整个子树。也就是说,如果我给2作为父输入,它将给我它下面的所有子元素作为一棵树,直到最后。
例子。。。一,
输入>父项代码=2
输出>
----------------------------------------------
PARENT_CODE CHILD_CODE CHILD_RANK
----------------------------------------------
2 5 3
2 6 3
2 8 4
----------------------------------------------
在这里,我们使用了CET
; WITH rekurs AS (
SELECT child_code, child_rank
FROM tbl
WHERE parent_code = 2
UNION ALL
SELECT ch.child_code, ch.child_rank
FROM tbl ch
JOIN rekurs r ON ch.parent_code = r.child_code
)
SELECT 2 AS PARENT_CODE, child_code, child_rank
FROM CTE
我们已经添加了这个CTE输入输出程序,但是在这里我们正在处理大量的记录,我们面临一些问题。在这个CTE中,我们传递的是一个父代码
,我们将获得该特定代码的所有子代码
在这里,我们想要得到30000个父代码的所有子代码,当我们在C程序的for循环中将
父代码
一个接一个地传递给CTE时,需要花费很多时间。有没有办法解决这个问题?您可以使用以下代码
假设您的表名为data
,则:
declare @input int =2
;with report as(
select ChildCode,ParentCode,ChildRank,ParentRank
from data
where ParentCode = @input
union all
select d.ChildCode,d.ParentCode,d.ChildRank,d.ParentRank
from data d
inner join report r on d.ParentCode = r.ChildCode
)
select * from report
这是一张工作票
结果
ChildCode ParentCode ChildRank ParentRank
5 2 3 2
6 2 3 2
8 5 4 3
根据下面的评论编辑
解释
将类型ParentInputs创建为表(ParentCode int)
;with report as(
select ChildCode,d.ParentCode,ChildRank,ParentRank
from @data d
inner join @input p on d.ParentCode = p.ParentCode
union all
select d.ChildCode,d.ParentCode,d.ChildRank,d.ParentRank
from @data d
inner join report r on d.ParentCode = r.ChildCode
)
select * from report order by ParentCode
为了演示,我创建了一个参数表,而不是表类型,请查找工作表
父代码的结果(2,3)
希望这将对您有所帮助以下内容是否适用于您:
; WITH rekurs AS (
SELECT parent_code Root_code, child_code, child_rank
FROM RecursiveTable
WHERE parent_code IN (1, 2, 3)
UNION ALL
SELECT r.Root_code, ch.child_code, ch.child_Rank
FROM RecursiveTable ch
JOIN rekurs r ON ch.parent_code = r.child_code
)
SELECT Root_code, child_code, child_Rank
FROM rekurs
ORDER BY Root_code
这是结果集:
Root_code child_code child_Rank
1 2 2
1 3 2
1 4 2
1 7 3
1 5 3
1 6 3
1 8 4
2 5 3
2 6 3
2 8 4
3 7 3
为什么不使用表变量而不是逐个调用来传递ID呢?建议的解决方案是好的。这也证明了以父子关系的方式存储百万行是不好的,因为对百万条记录的递归查询确实是不好的。对于工作解决方案+1,但分号位于前一行的末尾,不是在
前面的行的开头,用@AshleyPillay表示分号,从技术上讲,你是对的,但通常的做法是将其添加到with前面,以确保不要忘记,因为在特定单词之前必须有一个尾随分号,虽然大多数其他人不需要这样做,但这是一种常见做法,因为大多数人不理解SQL Server发出的错误消息,即在with
之前使用分号,因此他们只是在不理解它是ANSI SQL规范中的语句终止符的情况下使用分号。我们应该尝试遵循ANSI规范并习惯于使用它用分号终止所有SQL语句。(咆哮:)@Monah,我认为你的答案只是添加了一个参数,但没有帮助他们解决问题,因为每个问题都有许多家长,在
中使用将不适用于这个问题,特别是有30000个家长,
中的可以用于限制值2100 max,我认为,因此查询将给他一个错误,还将值传递给SQL,它将作为字符串,因此这里有另一个性能problem@Monah是的,你完全正确,我的目的只是向他展示如何在每次通话中获得多棵树;可以肯定地将IN更改为联接或其他任何内容
Root_code child_code child_Rank
1 2 2
1 3 2
1 4 2
1 7 3
1 5 3
1 6 3
1 8 4
2 5 3
2 6 3
2 8 4
3 7 3