Sql 从无限层次结构中选择子级
我有一个这样的SQL表Sql 从无限层次结构中选择子级,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个这样的SQL表 ID | ParentID 1 | null 2 | null 3 | null 4 | 1 5 | 4 6 | 5 7 | 6 8 | 7 9 | 8 现在,正如您所看到的,子-父关系得到了维护。我需要一个查询来选择给定ID的“所有级别”子级 假设我输入ID=1,结果应该是 ID | ParentID 1 | null 4 | 1 5 | 4 6 | 5
ID | ParentID
1 | null
2 | null
3 | null
4 | 1
5 | 4
6 | 5
7 | 6
8 | 7
9 | 8
现在,正如您所看到的,子-父关系得到了维护。我需要一个查询来选择给定ID的“所有级别”子级
假设我输入ID=1
,结果应该是
ID | ParentID
1 | null
4 | 1
5 | 4
6 | 5
7 | 6
8 | 7
9 | 8
因此,所有的直系子女,以及他们的子女在任何级别的子女,都应该上来
是否可以在MS SQL server中执行此操作?我有MS-SQL server 2012。来自SQL server 2005,已添加到SQL server的T-SQL中,可帮助您进行此类分层查询。这就是你要找的 试试这个工作:
或
尝试这样的递归过程
ALTER PROCEDURE dbo.GetChildren
@ParentId int
AS
SET NOCOUNT ON
SELECT *
FROM MainTable
WHERE ChildId IN
(
SELECT ParentId
FROM f_GetChildren(@ParentId)
UNION
SELECT ChildId
FROM f_GetChildren(@ParentId)
)
ORDER BY ParentId
SET NOCOUNT OFF
RETURN
下面是一个具有额外字段名的示例,但对于CTE,递归很简单:
DECLARE @ID int
SET @ID = 1;
WITH CTE_Table_1
(
ID,
Name,
ParentID,
TreeLevel
)
AS(
SELECT
ID,
Name,
ParentID,
0 AS TreeLevel
FROM Table_1
WHERE ID = @ID
UNION ALL
SELECT
T.ID,
T.Name,
T.ParentID,
TreeLevel + 1
FROM Table_1 T
INNER JOIN CTE_Table_1 ON CTE_Table_1.ID = T.ParentID
)
SELECT * FROM CTE_Table_1
是的,这可以帮助我,但我不知道如何在这方面工作,请提供一些例子。安德拉斯已经给出了这方面的CTE,我认为你很好去。
DECLARE @ID int
SET @ID = 1;
WITH CTE_Table_1
(
ID,
Name,
ParentID,
TreeLevel
)
AS(
SELECT
ID,
Name,
ParentID,
0 AS TreeLevel
FROM Table_1
WHERE ID = @ID
UNION ALL
SELECT
T.ID,
T.Name,
T.ParentID,
TreeLevel + 1
FROM Table_1 T
INNER JOIN CTE_Table_1 ON CTE_Table_1.ID = T.ParentID
)
SELECT * FROM CTE_Table_1