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

これは、追加のフィールド Name を使用した例ですが、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 に答える