Khóa Học SQL Server - Bài 32. Cách xây dựng câu truy vấn đệ quy

preview_player
Показать описание
Рекомендации по теме
Комментарии
Автор

Hay thực sự luôn thầy ạ cảm ơn kiến thức mà thầy mang lại ạ.
join ở đây nhìn khá lú haha mất 1 lúc để hiểu.Có thể coi cái e_cte là bảng chứa các cấp độ level khi nào cần lấy ra lever tiếp theo thì ta nối và kiểm tra với điều kiện là các thành viên sau bị quản lý bởi 1 trong các employId của bảng e_cte.

tavanvung
Автор

*Cảm ơn anh, lần đầu tiên em biết cái này*

nguyenthanhnhut
Автор

/*
- Tính số Fibonacci bằng Đệ Quy trong SQL Server
*/

WITH Fibonacci (_number, result, SoLanDeQuy)
AS
(
-- Phần Cơ Sở
SELECT
0 AS [_number]
, 1 AS [result]
, 0 AS [SoLanDeQuy]
UNION ALL
-- Phần Đệ Quy
SELECT
f.[result]
, f.[_number]+f.[result]
, f.[SoLanDeQuy]+1
FROM Fibonacci f
WHERE f.[SoLanDeQuy] < 5 -- Điều kiện dừng Đệ Quy
/*
Vì WHERE thực thi trước SELECT,
Nên muốn Đệ Quy bao nhiêu lần thì lấy số lần đệ quy làm giá trị của điều kiện dừng
Khác với Đệ Quy Tính Giai Thừa (có cột _number tăng mỗi lần 1 đơn vị nên có thể dùng _number để lập điều kiện dừng)
Còn Đệ Quy tính dãy số Fibonacci không có cột tăng mỗi lần 1 đơn vị nên phải tự thêm 1 cột SoLanDeQuy dùng để lập điều kiện dừng
*/
)
SELECT
[_number]
, [result]
FROM Fibonacci;

unitedkhiet
Автор

thầy ơi sao lại join được e_cte trong khi thằng e1 đang nằm trong e_cte ạ?

daotanphat
Автор

e thấy cái này không thực sự là đệ quy trong các ngôn ngữ lập trình mà nó như kiểu lặp lại các phép tính khi dùng CTE

AnimalAI
Автор

vẫn chx hiểu làm sao join bảng [NORTHWND].[dbo].[Employees] với cái bảng e_cte

tranbatung
Автор

e chưa hiểu cái đoạn join kia là sao ạ, tại sao:
join e_cte on e_cte.EmployeeID = e1.ReportsTo
ai giải thích giúp e với ạ

quangvinh
Автор

/*
- Tính Giai Thừa bằng Đệ Quy trong SQL Server
*/

WITH GiaiThua (_number, result)
AS
(
--Phan Co So
SELECT
1 AS [_number]
, 1 AS [result]
UNION ALL
--Phan De Quy
SELECT
gt.[_number]+1
, gt.[result]*(gt.[_number]+1)
FROM GiaiThua gt
WHERE gt.[_number] < 5 --Điều kiện dừng GiaiThua.
/*
Vì WHERE được thực thi trước SELECT,
nên Điều kiện dừng = Giai thừa muốn tính,
Ví dụ muốn tính giai thừa của 5 thì điều kiện dừng là _number < 5
*/
)
SELECT TOP 1 *
FROM GiaiThua
ORDER BY [result] DESC;

unitedkhiet