3

我有一个这样的 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 服务器中执行此操作?我有 MS-SQL 服务器 2012。

4

3 回答 3

3

这是一个带有额外字段名称的示例,但使用 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
于 2012-08-24T06:33:24.680 回答
1

试试这个工作正常:http ://www.sqlteam.com/Forums/topic.asp?TOPIC_ID=101053

-- Structure
create table dbo.MyPeople (Id int, Name varchar(30), ParentId int)

-- Data
insert dbo.MyPeople
          select 1, 'P1', null
union all select 2, 'P2', null
union all select 3, 'P1C1', 1
union all select 4, 'P1C2', 1
union all select 5, 'P2C1', 2
union all select 6, 'P1C2C1', 4
union all select 7, 'P1C1C1', 3
union all select 8, 'P1C1C1C1', 7
union all select 9, 'P2C1C1', 5
union all select 10, 'P1C3', 1
go

-- Function
create function dbo.AncestorPath(@Id int) returns varchar(100) as
begin
    declare @Path varchar(100)
    while 0 = 0
    begin
        select @Path = cast(Id as varchar(5)) + isnull('/' + @Path, ''), @Id = ParentId
        from dbo.MyPeople where Id = @Id

        if @@rowcount = 0 break
    end

    return @Path
end
go

-- Calculation
select * from (
    select *, dbo.AncestorPath(Id) as AncestorPath from dbo.MyPeople) a
where '/' + AncestorPath + '/' like '%/1/%'

或者

尝试这样的递归过程

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
于 2012-08-24T06:19:37.173 回答
0

从 SQL Server 2005 开始,公共表表达式已添加到 SQL Server 的 T-SQL 中,可帮助您进行此类分层查询。这就是你要找的!

于 2012-08-24T06:17:04.987 回答