Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Abfrage der Eltern-Kind-Beziehung auf der obersten Ebene

Denn Permission is NOT NULL in der Hierarchie sein muss, dann wird diese Zeile zum Stammknoten für diesen Fall. Ich habe diese RootID gekennzeichnet hier

Außerdem wurden weitere Beispieldaten hinzugefügt, um mehrere Zweige derselben ParentID = 0 anzuzeigen root

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');