6

私のデータは、Id と ParentId の 2 つのフィールドを持つテーブルにあります。この構造でデータを保存します(以下の同様の画像)。Id = 6 を含むリーフからルートへのすべてのパスを取得するにはどうすればよいですか? (結果のサンプルは以下にあります)

--Data structure is as follow :
--  1
-- /
--2 <- 3       9
-- \    \    / 
--  4 <- 5  7  8
--    \  /  /  /
--      6 - - -
--   /    \
--  10  <- 11
-- /
--12

--Data In Table Is :
--Id    ParentId
--1     null
--2     1
--3     2
--4     2
--5     3
--5     4
--6     4
--6     5
--6     7
--6     8
--7     9
--8     null
--9     null
--10    6
--11    6
--11    10
--12    10

--Result for all trees that include "Id = 6":
--12 > 10 > 6 > 4 > 2 > 1
--12 > 10 > 6 > 5 > 4 > 2 > 1
--12 > 10 > 6 > 5 > 3 > 2 > 1
--12 > 10 > 6 > 7 > 9
--12 > 10 > 6 > 8
--11 > 10 > 6 > 4 > 2 > 1
--11 > 10 > 6 > 5 > 4 > 2 > 1
--11 > 10 > 6 > 5 > 3 > 2 > 1
--11 > 10 > 6 > 7 > 9
--11 > 10 > 6 > 8
--11 > 6 > 4 > 2 > 1
--11 > 6 > 5 > 4 > 2 > 1
--11 > 6 > 5 > 3 > 2 > 1
--11 > 6 > 7 > 9
--11 > 6 > 8
4

2 に答える 2

4

あなたのテーブルは4が親としてそれ自体を持っていると言っていますが、それ以外のものは何もありませんが、12> 10> 6> 5> 4> 2> 1であることを示す行が1つあるため、その設定で同じ結果を生成することはできません.

これに対する私のsqlfiddleはここにあります:http://sqlfiddle.com/#!6/873b9/3

4 が親として 2 を持っていると仮定すると、私のコードは次のようになります (順序は少し異なるかもしれませんが、その SQL は問題ありません):

WITH records as
(
  SELECT
  leaf.Id
  ,leaf.ParentId
  ,case when NOT EXISTS(SELECT * FROM recTest where ParentId = leaf.Id) then 1 else 0 end as isLeaf
  FROM recTest as leaf
)
,hierarchy as
(
  SELECT Id
  ,NULL as ParentId
  ,cast(Id as varchar(100)) as chain
  ,isLeaf
  FROM records
  where ParentId IS NULL
  UNION ALL
  SELECT r.Id
  ,r.ParentId
  ,cast(cast(r.Id as varchar(100)) + ' > ' + h.chain as varchar(100)) as chain
  ,r.isLeaf
  FROM records as r
    INNER JOIN hierarchy as h
      ON r.ParentId = h.Id
)
SELECT
h.chain
FROM hierarchy as h
WHERE isLeaf = 1
AND h.chain like '%6%'
OPTION (MAXRECURSION 0)
于 2013-04-23T11:13:55.690 に答える