NodeId NodeName ParentId パーミッション ----------------------------------------------- 1 ノード1 0 1 2 ノード 2 1 ヌル 3 ノード 3 1 ヌル 4 ノード 4 1 ヌル 5 ノード 5 2 ヌル 6 ノード 6 5 ヌル 7 ノード 7 2 ヌル
私は Node6 にいて、ツリーで最初の非 NULL 許可を取得する必要があります (6->5->2->1-> 許可 = 1) どうすればよいですか?
NodeId NodeName ParentId パーミッション ----------------------------------------------- 1 ノード1 0 1 2 ノード 2 1 ヌル 3 ノード 3 1 ヌル 4 ノード 4 1 ヌル 5 ノード 5 2 ヌル 6 ノード 6 5 ヌル 7 ノード 7 2 ヌル
私は Node6 にいて、ツリーで最初の非 NULL 許可を取得する必要があります (6->5->2->1-> 許可 = 1) どうすればよいですか?
は階層内にある必要があるためPermission is NOT NULL
、この行はこの場合のルート ノードになります。RootID
ここにラベルを付けました
ParentID = 0
また、同じルートからの複数の分岐を示すサンプル データを追加しました
DECLARE @t TABLE (NodeId int, NodeName varchar(100), ParentId int, Permission int)
INSERT @t VALUES
(1,'Node1',0,NULL),
(2,'Node2',1,1),
(3,'Node3',1,NULL),
(4,'Node4',1,NULL),
(5,'Node5',2,NULL),
(6,'Node6',5,NULL),
(7,'Node7',2,NULL),
(8,'Node1',0,NULL),
(9,'Node9',8,2),
(10,'Node10',9,NULL),
(11,'Node11',10,NULL),
(12,'Node12',11,NULL),
(13,'Node13',10,NULL),
(14,'Node14',9,NULL);
WITH CTE AS
(
SELECT NodeId, NodeName, ParentId AS RootID FROM @t WHERE Permission IS NOT NULL
UNION ALL
SELECT T.NodeId, T.NodeName, CTE.RootID
FROM @t T JOIN CTE ON T.ParentId = CTE.NodeId
)
SELECT
*
FROM
CTE
WHERE
NodeName IN ('Node6', 'Node13');