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

Làm thế nào để thiết kế một truy vấn đệ quy SQL?

Xem:

Cập nhật:

Một CTE đệ quy thích hợp về cơ bản bao gồm ba điều:

  • một mỏ neo SELECT đầu tiên là; có thể chọn ví dụ:nhân viên cấp cơ sở (trong đó Reports_To là NULL), hoặc nó có thể chọn bất kỳ nhân viên tùy ý nào mà bạn xác định, ví dụ:bởi một tham số

  • một UNION ALL

  • một đệ quy SELECT câu lệnh chọn từ cùng một bảng, thường là bảng tự tham chiếu và kết hợp với CTE đệ quy hiện đang được xây dựng

Điều này cung cấp cho bạn khả năng tạo đệ quy một tập kết quả mà sau đó bạn có thể chọn từ đó.

Nếu bạn nhìn vào Northwind cơ sở dữ liệu mẫu, nó có một bảng được gọi là Employees tự tham chiếu:Employees.ReportsTo --> Employees.EmployeeID xác định ai báo cáo cho ai.

CTE của bạn sẽ trông giống như sau:

;WITH RecursiveCTE AS
(
    -- anchor query; get the CEO
    SELECT EmployeeID, FirstName, LastName, Title, 1 AS 'Level', ReportsTo
    FROM dbo.Employees
    WHERE ReportsTo IS NULL

    UNION ALL

    -- recursive part; select next Employees that have ReportsTo -> cte.EmployeeID      
    SELECT 
       e.EmployeeID, e.FirstName, e.LastName, e.Title, 
       cte.Level + 1 AS 'Level', e.ReportsTo
    FROM 
       dbo.Employees e
    INNER JOIN 
       RecursiveCTE cte ON e.ReportsTo = cte.EmployeeID
)
SELECT *
FROM RecursiveCTE
ORDER BY Level, LastName    

Tôi không biết liệu bạn có thể dịch mẫu của mình sang CTE đệ quy thích hợp hay không - nhưng về cơ bản đó là ý chính của nó: truy vấn neo, UNION ALL, truy vấn đệ quy




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thực thi thủ tục được lưu trữ bằng cách sử dụng khung thực thể

  2. Truy vấn con / cha đệ quy trong T / SQL

  3. Cách thêm Ràng buộc Mặc định vào các Cột hiện có trong Bảng SQL Server - Hướng dẫn SQL Server / TSQL Phần 91

  4. Hợp nhất nhiều hàng thành một hàng

  5. Mục đích sử dụng OPTION (MAXDOP 1) trong SQL Server là gì?