4

次の表を考えます。

create table TreeNode
(
  ID int not null primary key,
  ParentID int null foreign key references TreeNode (ID)
)

ルート (WHERE ParentID IS NULL) から開始し、結果セットにターゲット ノードが含まれるまで (たとえば、WHERE ID = n) その子孫をたどる共通テーブル式を作成するにはどうすればよいでしょうか? ターゲット ノードから開始してルートまで上に移動するのは簡単ですが、同じ結果セットは生成されません。具体的には、ターゲット ノードと同じ親を持つノードは含まれません。

私の最初の試みは:

with Tree as
(
  select
    ID,
    ParentID
  from
    TreeNode
  where
    ParentID is null
  union all select
    a.ID,
    a.ParentID
  from
    TreeNode a
    inner join Tree b
      on b.ID = a.ParentID
  where
    not exists (select * from Tree where ID = @TargetID)
)

エラーが発生します:Recursive member of a common table expression 'Tree' has multiple recursive references.

: トップダウンのトラバーサルにのみ関心があります。

4

1 に答える 1

1

更新 2:

ツリーを両方向に「トラバース」する 3 回目の試み。

ParentIDsからTargetまでのすべての CTE を作成しrootます。次に、ショート リストに表示されるまたはから選択treeします。nodesIDParent

--
;
WITH    Tree
          AS ( SELECT   ID
                       ,ParentID
               FROM     TreeNode
               WHERE    [ID] = @targetId
               UNION ALL
               SELECT   a.ID
                       ,a.ParentID
               FROM     TreeNode a
                        INNER JOIN Tree b ON b.ParentID = a.ID
             )
    SELECT  *
    FROM    [dbo].[TreeNode] n
    WHERE  EXISTS (SELECT *
                   FROM [Tree] t
                   WHERE [t].[ID] = [n].[ID]
                         OR [t].[ID] = [n].[ParentID]
                  )
于 2010-10-21T15:42:55.507 に答える