Tôi muốn yêu cầu nhận được một số trợ giúp về cách hiểu “với đệ quy” hoạt động như thế nào. Chính xác hơn TẠI SAO truy vấn neo (thuật ngữ không đệ quy) không được sao chép vào lệnh gọi phụ của CTE. Tôi đã cố gắng hết sức để hiểu một mình nhưng tôi không chắc.
Trước hết, hãy lấy ví dụ về PostgreSQL, đây là ví dụ đơn giản nhất mà tôi tìm thấy (tạo tổng từ 1 đến 100):
WITH RECURSIVE t(n) AS (
VALUES (1)
UNION ALL
SELECT n+1 FROM t WHERE n < 100)
SELECT sum(n) FROM t;
Hướng dẫn mã của tôi (tôi đã sử dụng các liên kết bên dưới):
-
Đánh giá thuật ngữ không đệ quy. Đối với ĐOÀN […].
Đưa tất cả các hàng còn lại vào kết quả của truy vấn đệ quy, đồng thời đặt chúng vào một bảng làm việc tạm thời.
-
Miễn là bảng làm việc không trống , hãy lặp lại các bước sau:
-
Đánh giá thuật ngữ đệ quy, thay thế nội dung hiện tại của bảng làm việc để tự tham chiếu đệ quy. Đối với ĐOÀN […]. Bao gồm tất cả các hàng còn lại trong kết quả của truy vấn đệ quy và cũng đặt chúng trong một bảng trung gian tạm thời.
-
Thay thế nội dung của bảng làm việc bằng nội dung của bảng trung gian, sau đó làm trống bảng trung gian. “
-
LVL 0:
-
phần không đệ quy
- CTE: (N) 1
- BẢNG LÀM VIỆC: (N) 1
-
phần đệ quy
- CTE: (N) 1
- BẢNG LÀM VIỆC: (N) 1
- BẢNG TRUNG GIAN (N) 2
(đây là phần tôi nghĩ lung tung) – thay thế BẢNG LÀM VIỆC
Vì vậy, đệ quy t sẽ sử dụng WORKING TABLE để thực hiện SELECT n + 1 và đưa kết quả vào INTERMEDIATE TABLE.
-
ĐOÀN KẾT TẤT CẢ
- CTE: (N) 1 2
- BẢNG LÀM VIỆC: (N) 2
- BẢNG TRUNG GIAN: ĐÃ LÀM SẠCH
-
Sau đó, chúng ta đi vào lvl tiếp theo bằng cách gọi của t phải không? (vì điều kiện END WHERE n <100 = FALSE)
LVL 1:
Chúng tôi biết coz postgreSQL nói nó “Miễn là bảng làm việc không trống, hãy lặp lại các bước đệ quy” Vì vậy, nó sẽ lặp lại bước 2. và 3. (nếu tôi đúng) cho đến khi điều kiện END sau đó thực hiện SUM.
NHƯNG nếu tôi chỉ xem qua lệnh gọi của lvl tiếp theo của t, chúng ta có nên thực hiện giá trị (1) trước không?
Tôi thực sự bối rối về cách nó có thể.
Trân trọng, Falt4rm