参照:
- SQLServer-再帰CTEの簡単な例
- MSDN:共通テーブル式を使用した再帰クエリ
- SQLServer再帰CTE (これはあなたが取り組んでいるものとほとんど同じようです!)
更新:
適切な再帰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、再帰クエリ