Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy vấn sql cho bảng cây

Mở rộng trên câu trả lời của a_horse_with_no_name, phần này cho thấy cách sử dụng SQL Server triển khai CTE đệ quy ( áp dụng chéo một bản ghi đệ quy ) kết hợp với row_number () để tạo ra kết quả chính xác trong câu hỏi.

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)

Thành thật mà nói, việc sử dụng chính các ID để tạo ra "đường dẫn" cây sẽ hoạt động, vì chúng tôi sắp xếp thứ tự trực tiếp bằng id, nhưng tôi nghĩ rằng tôi sẽ trượt trong hàm 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. Có sự kết hợp giữa LIKE và IN trong SQL không?

  2. Cách lưu trữ bản ghi lịch sử trong bảng lịch sử trong SQL Server

  3. Ngăn chặn SQL Injection trong ASP.Net

  4. ExecuteReader yêu cầu một Kết nối mở và khả dụng. Trạng thái hiện tại của kết nối là Đang kết nối

  5. Cách tạo cơ sở dữ liệu trong SQL Server bằng TSQL hoặc GUI - Hướng dẫn SQL Server / TSQL Phần 24