MS SQL层次结构将所有子体连接到单个值中
我在这里搜索了几个小时,尽管我尽了最大的努力,却找不到任何能达到我想要的结果的东西 我找不到一个简单的方法来解释我在做什么,所以请考虑下面的例子数据:MS SQL层次结构将所有子体连接到单个值中,sql,sql-server,sql-server-2008-r2,hierarchical-data,Sql,Sql Server,Sql Server 2008 R2,Hierarchical Data,我在这里搜索了几个小时,尽管我尽了最大的努力,却找不到任何能达到我想要的结果的东西 我找不到一个简单的方法来解释我在做什么,所以请考虑下面的例子数据: Section_T SectionId SectionParentId S_Start S_End 1 NULL <A> </A> 2 NULL <B> &l
Section_T
SectionId SectionParentId S_Start S_End
1 NULL <A> </A>
2 NULL <B> </B>
3 NULL <C> </C>
4 NULL <D> </D>
5 4 <E> </E>
6 4 <F> </F>
7 4 <G> </G>
8 4 <H> </H>
9 8 <I> </I>
10 2 <J> </J>
Section\T
SectionId SectionParentId S_开始S_结束
1空
2空
3空
4空
5 4
6 4
7 4
8 4
9 8
10 2
并希望得到以下结果:
Section
<A></A>
<B><J></J></B>
<C></C>
<D><E></E><F></F><G></G><H><I></I></H></D>
部分
XML路径似乎不适用于这种情况,因为类似HTML标记的数据必须保留
实际数据要复杂得多,但找到解决方案将为我指明正确的方向,然后我可以从那里开始,因为我更愿意自己尽可能多地找出答案。您需要创建递归SQL函数,如下所示:
CREATE FUNCTION getSubNodes (@SectionId INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @SubNodes VARCHAR(MAX)
SET @SubNodes = ''
IF EXISTS(SELECT SectionId FROM Section_T WHERE SectionParentId = @SectionId)
BEGIN
SELECT @SubNodes = COALESCE(@SubNodes + '','') +
S_Start + dbo.getSubNodes(SectionId) + S_End
FROM Section_T
WHERE SectionParentId = @SectionId
ORDER BY SectionOrder
END
RETURN @SubNodes
END
您可以使用如下功能:
SELECT S_Start + dbo.getSubNodes(SectionId) + S_End
FROM Section_T
WHERE SectionParentId IS NULL
使用此方法是否仍然可以通过INT类型的order字段(比如SectionOrder)对子节点进行排序(在深度上)?是的,您可以在函数中添加order by子句。我确实尝试过,添加它会使函数只返回一个子节点。@UltimateVenom:您在哪里添加了order by子句?请用ORDER BY子句检查我的更新答案。我简化了它,现在它可以工作了,当我试图扩展它时,我显然遗漏了一些东西,但我还不确定是什么。。。你能想到什么会导致这种行为吗?