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

SQL Server đệ quy tự tham gia

Cte đệ quy để giải cứu ....

Tạo và điền bảng mẫu ( Vui lòng lưu cho chúng tôi bước này trong các câu hỏi trong tương lai của bạn):

DECLARE @T as table
(
    id int,
    name varchar(100),
    parent_id int
)

INSERT INTO @T VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4)

Cte:

;WITH CTE AS
(
    SELECT id, name, name as path, parent_id
    FROM @T 
    WHERE parent_id IS NULL
    UNION ALL
    SELECT t.id, t.name, cast(cte.path +','+ t.name as varchar(100)), t.parent_id
    FROM @T t
    INNER JOIN CTE ON t.parent_id = CTE.id
)

Truy vấn:

SELECT id, name, path
FROM CTE

Kết quả:

id      name        path
1       A           A
5       B           B
6       B.1         B,B.1
8       B.2         B,B.2
7       B.1.1       B,B.1,B.1.1
2       A.1         A,A.1
3       A.2         A,A.2
4       A.1.1       A,A.1,A.1.1
9       A.1.1.1     A,A.1,A.1.1,A.1.1.1
10      A.1.1.2     A,A.1,A.1.1,A.1.1.2

Xem bản trình diễn trực tuyến trên rextester




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CTE để nhận tất cả các con (con cháu) của một phụ huynh

  2. Trả về tất cả các kết hợp giá trị có thể có trên các cột trong SQL

  3. Làm cách nào để tôi có thể lên lịch công việc để chạy truy vấn SQL hàng ngày?

  4. Cách chuyển đổi từ định dạng ngày này sang định dạng ngày khác trong SQL Server bằng CONVERT ()

  5. MAX so với Top 1 - cái nào tốt hơn?