sql-server-2008 - T/SQL 中的递归子/父查询

标签 sql-server-2008 tsql recursion

我在 Microsoft SQL Server 2008 中使用 T/SQL

我有一张 table

CREATE TABLE [TestTable](
[CHILD] [int] NOT NULL,
[PARENT] [int] NOT NULL
) ON [PRIMARY]

GO

这些是定义父子层次关系的一些值
CHILD PARENT
1       2
2       0
3       1
4       2
5       0

从视觉上看,这张表看起来像这样
0
   2
      1
         3
      4
   5

理想情况下,我希望值显示如下(其中右侧栏表示世代)
CHILD    GENERATION
 0          0
 2          1
 1          2
 3          3
 4          2
 5          1

我的 T/SQL 代码看起来像这样
with n(CHILD, PARENT, GENERATION) as (
select CHILD, PARENT,1 as GENERATION from TestTable
where PARENT=0 
union all
select nplus1.CHILD, nplus1.PARENT, GENERATION+1 from TestTable as nplus1, n
where nplus1.PARENT=n.CHILD 
)
select CHILD,GENERATION from n

然而它不起作用!

它返回
CHILD   GENERATION
2        1
5        1
1        2
4        2
3        3

它具有正确的生成,但排序顺序错误!
有没有人有任何想法如何解决这个问题?

谢谢!

最佳答案

你需要你的递归来构建一些可以在最后排序的东西:

declare @t TABLE (
[CHILD] [int] NOT NULL,
[PARENT] [int] NOT NULL
) 

insert @t values
( 0, -1),   -- I added this
( 1, 2 ),
( 2, 0 ),
( 3, 1 ),
( 4, 2 ),
( 5, 0 )

(注意我添加了一个真正的根元素)
;with n(CHILD, PARENT, GENERATION, hierarchy) as (
select CHILD, PARENT,0, CAST(CHILD as nvarchar) as GENERATION from @t
where PARENT=-1
union all
select nplus1.CHILD, nplus1.PARENT, GENERATION+1, 
cast(n.hierarchy + '.' + CAST(nplus1.child as nvarchar) as nvarchar)
 from 
@t as nplus1 inner join n on nplus1.PARENT=n.CHILD 
)
select CHILD,GENERATION
from n
order by hierarchy

返回
CHILD       GENERATION
----------- -----------
0           0
2           1
1           2
3           3
4           2
5           1

包括hierarchy举例说明:
CHILD       GENERATION  hierarchy
----------- ----------- ------------------------------
0           0           0
2           1           0.2
1           2           0.2.1
3           3           0.2.1.3
4           2           0.2.4
5           1           0.5

根据您的 id 有多大,您可能需要使用零进行左填充才能正确排序。

请注意,SQL 2008 有一个内置的 hierarchy键入这种东西...

关于sql-server-2008 - T/SQL 中的递归子/父查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004543/

相关文章:

sql-server - 数据库设计 : Calculating the Account Balance

sql-server - SQL Server 空间查找剩余距离

.net - 使用 SqlBulkCopy 将记录批量插入 SQL 时精度丢失

sql - MSSQL - 选择表中最新出现的几行

sql-server - 使用来自另一个链接表的 XML 片段的 T-SQL XML 更新

c++ - 使用静态变量的递归调用的不同输出

sql-server - 全文关键字unicode

javascript - 尝试递归循环树时遇到问题

Python: "pass by reference"在递归提取中是否可以接受?

sql - 在 SQL SERVER 光标中从顶部继续?