再帰的にCTEを使用することはありません。私はちょうどそれについての記事を読んでいました。この記事では、SQLサーバーのCTEと再帰を使用して従業員情報を示します。基本的には従業員とそのマネージャーの情報を表示しています。このクエリがどのように機能するのか理解できません。クエリは次のとおりです。
WITH
cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
AS
(
SELECT EmployeeID, FirstName, LastName, ManagerID, 1
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
r.EmpLevel + 1
FROM Employees e
INNER JOIN cteReports r
ON e.ManagerID = r.EmpID
)
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT FirstName + ' ' + LastName FROM Employees
WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID
ここで私は出力がどのように表示されているかについて投稿しています:
最初にマネージャーを表示し、次に部下をループで表示する方法を知る必要があります。最初のSQLステートメントは1回だけ起動し、すべての従業員IDが返されると思います。
そして、2番目のクエリが繰り返し実行され、現在のマネージャーIDを使用してemployeeが存在するデータベースにクエリを実行します。
sqlステートメントが内部ループでどのように実行されるかを説明し、sqlの実行順序も教えてください。ありがとう。
私の質問の第2段階
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
Q 1)Nの値はどのように増加していますか?値が毎回Nに割り当てられる場合、N値はインクリメントできますが、最初にN値が初期化されたときのみです。
Q 2)CTEと従業員関係の再帰:
2人のマネージャーを追加し、2人目のマネージャーの下にさらに数人の従業員を追加した瞬間から、問題が始まります。
最初のマネージャーの詳細を表示し、次の行には、そのマネージャーの部下に関連する従業員の詳細のみを表示したいと思います。
仮定する
ID Name MgrID Level
--- ---- ------ -----
1 Keith NULL 1
2 Josh 1 2
3 Robin 1 2
4 Raja 2 3
5 Tridip NULL 1
6 Arijit 5 2
7 Amit 5 2
8 Dev 6 3
このようにCTE式で結果を表示したい。マネージャーと従業員の関係を引き出すために、ここで提供したSQLで何を変更するかを教えてください。ありがとう。
出力を次のようにします。
ID Name MgrID nLevel Family
----------- ------ ----------- ----------- --------------------
1 Keith NULL 1 1
3 Robin 1 2 1
2 Josh 1 2 1
4 Raja 2 3 1
5 Tridip NULL 1 2
7 Amit 5 2 2
6 Arijit 5 2 2
8 Dev 6 3 2
これは可能ですか...?