4

私は親子関係を持つテーブルを持っています:

Table A
Column Id int
Column Parent_Id int
Column Description text

データセットの例は次のとおりです。

999, NULL, 'Corp.'
998, 999, 'Div1',
997, 999, 'Div2', 
510, 998, 'Child Div1A',
110, 997, 'Child Div2A',
120, 997, 'Child Div2B',

私のクエリは、親を指定して、最下位の子のセットを返す必要があります。たとえば、999 を指定すると、510、110、120 が返されます。しかし、997 が指定された場合、110 と 120 のみが返されます。110 が指定された場合、何も返されません。クエリを正しくフォーマットする方法がわかりません。テーブル自体を JOIN することから始めましたが、実際に N レベル下げる必要がある場合でも、1 レベルしか下がらないようです。

4

2 に答える 2

5
Declare @t Table(ID int,Parent_ID int,Description varchar(20))

insert into @t values(999, NULL, 'Corp.')
insert into @t values(998, 999, 'Div1')
insert into @t values(997, 999, 'Div2')
insert into @t values(510, 998, 'Child Div1A')
insert into @t values(110, 997, 'Child Div2A')
insert into @t values(120, 997, 'Child Div2B')

;WITH Rollups AS (
    SELECT Id, Parent_Id, Description 
    FROM @t WHERE ID = 999
    UNION ALL
    SELECT parent.Id, parent.Parent_Id, child.Description
    FROM @t parent 
    INNER JOIN Rollups child ON child.Id = parent.Parent_Id
)
SELECT *
FROM Rollups
Where not Exists(Select * from @t where Parent_Id=Rollups.ID) 
于 2012-12-21T15:01:19.747 に答える
3

私はこれをテストしていませんが、必要なものだと思います- with を使用しますCTEUNION私が使用するより複雑な例から切り捨てました):

;WITH CTE (ChildID, [Text], ParentID)
AS
(
    SELECT ChildID, [Text], ParentID
    FROM Table1
    WHERE ParentId IS NULL --or = @ParentID
    UNION ALL
    SELECT T1.ChildID, T1.[Text], T1.ParentID
    FROM Table1 AS T1
    INNER JOIN CTE
    ON T1.ParentID = CTE.ChildID
)
SELECT ChildID, [Text]
FROM CTE
于 2012-12-21T14:58:30.793 に答える