Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 相邻列表-如何按id检索给定父节点的所有子节点?_Sql Server - Fatal编程技术网

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

Sql server 相邻列表-如何按id检索给定父节点的所有子节点?,sql-server,Sql Server,我有一张这样的桌子 id parent title 1 NULL Cars 2 1 Ford 3 2 Hatchback 4 2 Saloon 5 3 Fiesta 6 4 Mon

我有一张这样的桌子

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  
5           3               Fiesta
如果我想要id为3的所有子节点,我会

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

一句警告的话,这棵树可以有很多层次,而不仅仅是我上面展示的几个层次的简化。所以我假设查询需要以某种方式进行递归

您可以创建表值函数:

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)

您应该使用递归查询:

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