相邻列表 - 如何通过id检索给定父节点的所有子节点?

时间:2013-07-25 12:36:03

标签: sql-server

我有一张像这样的桌子

id          parent          title

1           NULL            Cars
2           1               Ford
3           2               Hatchback
4           2               Saloon
5           3               Fiesta
6           4               Mondeo  

我需要一个查询,它将返回一个特定id的子节点列表。

例如,如果我想要所有id为2的子节点,我会得到

3           2               Hatchback
4           2               Saloon
5           3               Fiesta
6           4               Mondeo  

如果我想要所有id为3的子节点,我会得到

5           3               Fiesta

警告一句,树可以是多层次的,而不仅仅是我上面简化的几个层次。所以我认为查询需要以某种方式递归?

2 个答案:

答案 0 :(得分:1)

您可以创建表值函数:

CREATE FUNCTION [ftChildren]
(
    @id int
)
RETURNS TABLE
AS RETURN
    WITH Tree(Parent, Title, ID)
    AS
    (
        SELECT Parent, Title, ID
        FROM TableName
        WHERE ID = @id
        UNION ALL
        SELECT s.Parent, s.Title, s.ID
        FROM TableName s JOIN Tree t ON t.ID = s.Parent
    )
    SELECT ID, Parent, Title
    FROM Tree
    WHERE ID != @id
GO

并将其用作:

select * from ftChildren(2)

答案 1 :(得分:1)

您应该使用递归查询:

with T1 as
(  select t.* from t where parent=2
   union all
   select t.* from t 
     join T1 on (t.parent=T1.id)
)
select * from T1

SqlFiddle demo