2

再帰的な階層 (つまり、ID、ParentID) を持つテーブルがあります。この階層内の任意のアイテムについて、各行のレベルとともに、階層を上下に移動するすべてのリストを戻すことができるようにしたいと考えています。親が持つことができる子は 1 人だけであると仮定します。

たとえば、次のようにします。

ID    ParentID
--------------
1     NULL
2     1
3     2
4     NULL
5     4
6     5

ID 1、2、または 3 を指定すると、次のものが返されます。

ID    ParentID    Level
-----------------------
1     NULL        1
2     1           2
3     2           3

私は以前にこれをやったことがありますが、方法を思い出せません。ソリューションに CTE が含まれていることはわかっていますが、正しく理解できません。どんな助けでも大歓迎です。

4

3 に答える 3

5
;with cte as 
(
    select *, 1 as level from @t where id = @yourid
    union all
    select t.*, level - 1
    from cte 
        inner join @t t on cte.parent = t.id
),
cte2 as
(   
    select * from cte
    union all
    select t.*, level+1
    from cte2 
        inner join @t t on cte2.id = t.parent

)
    select id,parent, ROW_NUMBER() over (order by level) level
    from (  select distinct id, parent, level from cte2) v
于 2012-09-28T14:34:47.617 に答える
0

私が思いつく CTE クエリの最も基本的なバージョンは次のとおりです。

WITH Ancestry (AncestorID, DescendantID)
AS
(
    SELECT 
        ParentID, ID
    FROM
        dbo.Location
    WHERE
        ParentID IS NOT NULL
UNION ALL
    SELECT 
        P.AncestorID, C.ID
    FROM
        dbo.Location C
    JOIN
        Ancestry P on C.ParentID = P.DescendantID
)
SELECT * FROM Ancestry

結果は、テーブルに存在するすべての祖先/子孫関係のリストです。

最後の「SELECT * FROM Ancestry」は、フィルタリングや順序付けなど、より複雑なものに置き換えることができます。

再帰関係を含めるには、最後の SELECT ステートメントに次の 2 行を追加してクエリを変更します。

SELECT * FROM Ancestry
UNION
SELECT ID, ID FROM dbo.Location
于 2015-05-12T15:57:57.000 に答える
-1
;WITH Recursive_CTE AS (
     SELECT
          child.ExecutiveId,
          CAST(child.ExecutiveName as varchar(100)) BusinessUnit,
          CAST(NULL as bigint) ParentUnitID,
          CAST(NULL as varchar(100)) ParentUnit,
          CAST('' as varchar(100)) LVL,
          CAST(child.ExecutiveId as varchar(100)) Hierarchy,
      1 AS RecursionLevel
     FROM Sales_Executive_level child
     WHERE ExecutiveId = 4000 --your Id which you want to get all parent node
     UNION ALL 
     SELECT
      child.ExecutiveId,
      CAST(LVL + child.ExecutiveName as varchar(100)) AS BusinessUnit,
      child.ParentExecutiveID,
      parent.BusinessUnit ParentUnit,
      CAST('' + LVL as varchar(100)) AS LVL,
      CAST(Hierarchy + ':' + CAST(child.ExecutiveId as varchar(100)) as varchar(100)) Hierarchy,
      RecursionLevel + 1 AS RecursionLevel
     FROM Recursive_CTE parent 
     INNER JOIN Sales_Executive_level child ON child.ParentExecutiveID = parent.ExecutiveId                           
    )
    SELECT * FROM Recursive_CTE ORDER BY Hierarchy  
    OPTION (MAXRECURSION 300); 
于 2014-05-01T09:56:31.170 に答える