ฉันไม่เคยใช้ CTE กับการเรียกซ้ำ ฉันเพิ่งอ่านบทความเกี่ยวกับเรื่องนี้ บทความนี้แสดงข้อมูลพนักงานด้วยความช่วยเหลือของ Sql server 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 แรกเริ่มทำงานเพียงครั้งเดียวและส่งคืนรหัสพนักงานทั้งหมด
และแบบสอบถามที่สองเริ่มทำงานซ้ำ ๆ โดยค้นหาฐานข้อมูลที่มีพนักงานอยู่ด้วย 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
คำถาม 1) ค่าของ N เพิ่มขึ้นอย่างไร? หากกำหนดค่าให้กับ N ทุกครั้งค่า N สามารถเพิ่มขึ้นได้ แต่จะเริ่มต้นค่า N ครั้งแรกเท่านั้น
Q 2) CTE และการเรียกซ้ำของพนักงานสัมพันธ์:
ขณะที่ฉันเพิ่มผู้จัดการสองคนและเพิ่มพนักงานอีกสองสามคนภายใต้ผู้จัดการคนที่สองคือจุดเริ่มต้นของปัญหา
ฉันต้องการแสดงรายละเอียดผู้จัดการคนแรกและในแถวถัดไปเฉพาะรายละเอียดพนักงานที่เกี่ยวข้องกับผู้ใต้บังคับบัญชาของผู้จัดการคนนั้น
สมมติ
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
เป็นไปได้ไหม ... ?