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

我有一个这样的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
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