Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zapytanie o relację rodzic-dziecko do najwyższego poziomu

Ponieważ Permission is NOT NULL musi znajdować się w hierarchii, to ten wiersz staje się w tym przypadku węzłem głównym. Oznaczyłem ten RootID tutaj

Dodano również więcej przykładowych danych, aby pokazać wiele gałęzi z tego samego ParentID = 0 korzeń

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupowanie SQL według miesiąca i roku

  2. Dodawanie tożsamości do istniejącej kolumny

  3. Dwukrotne przestawianie danych z dynamicznym sql i niestandardowymi nazwami kolumn

  4. Jak wybrać rekordy, które nie istnieją na serwerze SQL?

  5. Jak wygenerować zakres dat w SQL Server