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

Zapytanie SQL dla tabeli drzewa

Rozwijając odpowiedź a_horse_with_no_name, pokazujemy, jak korzystać z implementacji rekursywnego CTE w SQL Server (zastosowanie rekursywnego pojedynczego rekordu krzyżowego ) w połączeniu z row_number(), aby uzyskać dokładny wynik w pytaniu.

declare @t table(id int,parentId int,name varchar(20))
insert @t select 1,  0        ,'Category1'
insert @t select 2,  0,        'Category2'
insert @t select 3,  1,        'Category3'
insert @t select 4 , 2,        'Category4'
insert @t select 5 , 1,        'Category5'
insert @t select 6 , 2,        'Category6'
insert @t select 7 , 3,        'Category7'
;

WITH tree (id, parentid, level, name, rn) as 
(
   SELECT id, parentid, 0 as level, name,
       convert(varchar(max),right(row_number() over (order by id),10)) rn
   FROM @t
   WHERE parentid = 0

   UNION ALL

   SELECT c2.id, c2.parentid, tree.level + 1, c2.name,
       rn + '/' + convert(varchar(max),right(row_number() over (order by tree.id),10))
   FROM @t c2 
     INNER JOIN tree ON tree.id = c2.parentid
)
SELECT *
FROM tree
ORDER BY cast('/' + RN + '/' as hierarchyid)

Szczerze mówiąc, użycie samych identyfikatorów do utworzenia „ścieżki” drzewa zadziałałoby, ponieważ zamawiamy bezpośrednio według identyfikatora, ale pomyślałem, że wpadnę w funkcję row_number().



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj FILEGROUP_ID(), aby zwrócić identyfikator grupy plików w SQL Server

  2. Uzyskaj liczbę nieudanych prób logowania dla logowania z powodu nieprawidłowego hasła w programie SQL Server (T-SQL)

  3. Kiedy/dlaczego używać kaskadowania w SQL Server?

  4. Utwórz wyzwalacz DML w SQL Server

  5. Skonfiguruj Lucene.Net z SQL Server