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

Nhận các bản ghi có chứa tất cả các bản ghi con trong máy chủ sql

Bạn cần sử dụng một biểu thức bảng chung đệ quy, sau đó lọc kết quả chỉ để tìm đường dẫn cơ sở cho mỗi bản ghi, (tức là đối với ID 1131, hãy lấy ABC/RST/UVW và không chỉ ABC/RST

WITH CTE AS
(   SELECT  ID, 
            Name, 
            ParentID, 
            NextParentID = ParentID, 
            Path = CAST(Name AS VARCHAR(MAX)),
            Recursion = 1
    FROM    T
    UNION ALL
    SELECT  CTE.ID, 
            CTE.Name, 
            CTE.ParentID, 
            T.ParentID, 
            CAST(T.Name + '/' + CTE.Path AS VARCHAR(MAX)),
            Recursion + 1
    FROM    CTE
            INNER JOIN T
                ON CTE.NextParentID = T.ID
), CTE2 AS
(   SELECT  CTE.ID,
            CTE.Name,
            CTE.ParentID,
            CTE.Path,
            RowNumber = ROW_NUMBER() OVER(PARTITION BY CTE.ID ORDER BY Recursion DESC)
    FROM    CTE
)
SELECT  ID, Name, ParentID, Path
FROM    CTE2
WHERE   RowNumber = 1;

Ví dụ về SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Một trình kích hoạt để hoạt động trên nhiều lần chèn hàng

  2. Ảnh chụp nhanh cơ sở dữ liệu SQL Server -4

  3. SQL:mệnh đề in trong thủ tục được lưu trữ:cách chuyển giá trị

  4. CHỌN và CẬP NHẬT bảng để không có sự chồng chéo của Chủ đề

  5. Làm thế nào để phân tích cú pháp một chuỗi và tạo một số cột từ nó?