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

SQL Server 2008 CTE đệ quy

Không thực sự khó làm như vậy:

;WITH cte AS
(
    SELECT CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID
    FROM dbo.YourTable
    WHERE parent_id IS NULL

    UNION ALL

    SELECT CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID
    FROM dbo.YourTable t
    INNER JOIN cte ON t.parent_id = cte.id
)
SELECT cteName FROM cte
ORDER BY ID

Cung cấp cho tôi kết quả đầu ra là:

/A
/A/B
/A/B/C
/A/D

Một lưu ý phụ:"độ sâu" có thể được CTE tính toán dễ dàng và bạn không nhất thiết phải lưu trữ độ sâu đó trong bảng của mình (xem Level cột tôi đã thêm):

;WITH cte AS
(
    SELECT 
       CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID, 
       1 AS 'Level'
    FROM dbo.YourTable
    WHERE parent_id IS NULL

    UNION ALL

    SELECT 
       CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID,
       cte.Level + 1 AS 'Level'
    FROM dbo.YourTable t
    INNER JOIN cte ON t.parent_id = cte.id
)
SELECT cteName FROM cte
ORDER BY Level, ID


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlConnection.Close () bên trong câu lệnh using

  2. Cách so sánh datetime với chỉ ngày trong SQL Server

  3. SQL Server Thay đổi tên cơ sở dữ liệu

  4. SQL Server (2008) Chuyển ArrayList hoặc String tới SP cho IN ()

  5. Khóa chính trong SQL Server