Saya tidak pernah menggunakan CTE dengan rekursi. Saya baru saja membaca artikel tentang itu. Artikel ini menunjukkan info karyawan dengan bantuan CTE dan rekursi server Sql. Ini pada dasarnya menunjukkan karyawan dan info manajer mereka. Saya tidak dapat memahami cara kerja kueri ini. Berikut pertanyaannya:
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
Di sini saya memposting tentang bagaimana output ditampilkan:
Saya hanya perlu tahu bagaimana hal itu menunjukkan manajer terlebih dahulu dan kemudian bawahannya dalam satu lingkaran. Saya kira pernyataan sql pertama hanya menyala sekali dan itu mengembalikan semua id karyawan.
Dan kueri kedua berulang kali diaktifkan, menanyakan database tempat karyawan ada dengan id manajer saat ini.
Tolong jelaskan bagaimana pernyataan sql dieksekusi dalam loop internal dan beri tahu saya urutan eksekusi sql. Terima kasih.
Pertanyaan tahap kedua SAYA
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
Q 1) Bagaimana nilai N bertambah? jika nilai diberikan ke N setiap kali maka nilai N dapat bertambah tetapi hanya pertama kali nilai N diinisialisasi.
Q 2) CTE dan rekursi hubungan karyawan:
Saat saya menambahkan dua manajer dan menambahkan beberapa karyawan lagi di bawah manajer kedua adalah tempat masalah dimulai.
Saya ingin menampilkan detail manajer pertama dan di baris berikutnya hanya detail karyawan yang terkait dengan bawahan manajer tersebut.
Seharusnya
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
Saya ingin menampilkan hasil sedemikian rupa dengan ekspresi CTE. Tolong beri tahu saya apa yang harus diubah di sql saya yang saya berikan di sini untuk menarik hubungan manajer-karyawan. Terima kasih.
Saya ingin hasilnya seperti ini:
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
Apakah ini mungkin ...?
Ingin menguraikan paralel semantik singkat dengan jawaban yang sudah benar.
Dalam istilah 'sederhana', CTE rekursif dapat didefinisikan secara semantik sebagai bagian berikut:
1: Kueri CTE. Juga dikenal sebagai ANCHOR.
2: Kueri CTE rekursif pada CTE di (1) dengan UNION ALL (atau UNION atau EXCEPT atau INTERSECT) sehingga hasil akhir dikembalikan sesuai keinginan.
3: Kondisi pojok / penghentian. Yang secara default ketika tidak ada lagi baris / tupel yang dikembalikan oleh kueri rekursif.
Contoh singkat yang akan memperjelas gambar:
Penjelasan: Kueri CTE pertama mengembalikan pemasok dasar (seperti daun) yang tidak memasok ke pemasok lain secara langsung (-1)
Kueri rekursif pada iterasi pertama mendapatkan semua pemasok yang memasok ke pemasok dikembalikan oleh ANCHOR. Proses ini berlanjut sampai kondisi mengembalikan tupel.
UNION ALL mengembalikan semua tupel selama total panggilan rekursif.
Contoh bagus lainnya dapat ditemukan di sini .
PS: Agar CTE rekursif berfungsi, relasi harus memiliki kondisi hierarkis (rekursif) untuk bekerja. Contoh: elementId = elementParentId .. Anda mendapatkan intinya.
sumber
Proses eksekusi benar-benar membingungkan dengan CTE rekursif, saya menemukan jawaban terbaik di https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx dan abstrak dari proses eksekusi CTE adalah seperti di bawah ini.
Semantik dari eksekusi rekursif adalah sebagai berikut:
sumber
sumber