sql >> データベース >  >> RDS >> Sqlserver

SQL再帰クエリを設計する方法は?

    参照:

    更新:

    適切な再帰CTEは、基本的に3つの要素で構成されます。

    • アンカー SELECT そもそも;たとえば、ルートレベルの従業員(Reports_To はNULL)、または定義した任意の従業員を選択できます。パラメータによる

    • UNION ALL

    • 再帰的 SELECT 同じ、通常は自己参照テーブルから選択し、現在構築されている再帰CTEと結合するステートメント

    これにより、結果セットを再帰的に構築して、そこから選択できるようになります。

    Northwindを見ると サンプルデータベースには、Employeesというテーブルがあります。 これは自己参照型です:Employees.ReportsTo --> Employees.EmployeeID 誰が誰に報告するかを定義します。

    CTEは次のようになります:

    ;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    
    

    サンプルを適切な再帰CTEに変換できるかどうかはわかりませんが、基本的にはその要点です。アンカークエリ、UNION ALL、再帰クエリ




    1. 左結合を使用したMySQLクエリは非常に遅い

    2. エラーメッセージのないエラーをデバッグするにはどうすればよいですか?

    3. MS AccessとSQLの違いは何ですか?

    4. OracleSQLDeveloperでユーザーを作成する方法