「MurachのSQL Server 2016開発者向け」の本の例があります。この例は、SQLで再帰CTSをコード化する方法を示しています。 Imは再帰関数(C#で)をよく知っていますが、SQL再帰ロジックの仕組みを何とか理解できません。再帰クエリCTE
USE Examples;
WITH EmployeesCTE AS
(
-- Anchor member
SELECT EmployeeID,
FirstName + ' ' + LastName As EmployeeName,
1 As Rank
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
-- Recursive member
SELECT Employees.EmployeeID,
FirstName + ' ' + LastName,
Rank + 1
FROM Employees
JOIN EmployeesCTE
ON Employees.ManagerID = EmployeesCTE.EmployeeID
)
SELECT *
FROM EmployeesCTE
ORDER BY Rank, EmployeeID;
このクエリは、組織内の従業員の階層レベルを返します。 はここでの例です。
私の質問:再帰関数では、(ベースケースに到達することによって)再帰を終了する減分変数が表示されます。私の質問は、EmployeesCTEの対応する部分はどこですか?論理を理解するのを手伝ってください。
ここで、 'INNER JOIN'はフィルタとして機能し、基礎となるテーブルには循環参照がない限り、その" ON "条件サーバを"ターミネータ "として機能します。 –
経験の浅いので、大規模なデータではパフォーマンスが悪くなることに注意してください。あるいは、RootManagerIDをEmployeesテーブルに追加することを検討してください。次に、「SELECT EmployeeID、ManagerID、FirstName + '' + LastName As EmployeesName From Employees WHERE RootManagerID = @ RootManagerID'」を選択します。次に、アプリケーションレベルでツリーを構築します。このアプローチの大きなパフォーマンス上の利点の他に、 'RootManagerID'にインデックスを作成することでパフォーマンスをさらに向上させることもできます。 – yazanpro
@yazanpro、これは*大量のデータに悪い* *隠されたRBAR *であるために悪くなります* ... – Shnugo