再帰で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で従業員が存在するデータベースにクエリを実行します。
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
これは可能ですか...?