1

我有一张这样的桌子

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

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

4

2 回答 2

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)
于 2013-07-25T12:40:50.217 回答
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 演示

于 2013-07-25T12:42:56.323 回答