Duyệt qua hệ phân cấp
Thuộc phần Vượt ra ngoài kiến thức cơ bản trong hành trình SQL của Coddy. Bài học 21 trên 27.
Lý do thực sự khiến CTE đệ quy tồn tại: lần theo mối quan hệ cha/con được lưu trong một bảng duy nhất. Giả sử employees có cột manager_id trỏ ngược lại vào chính bảng đó:
WITH RECURSIVE chain AS (
SELECT id, name, manager_id
FROM employees WHERE id = 7 -- điểm bắt đầu: nhân viên đầu tiên
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN chain c ON e.id = c.manager_id -- đệ quy: chuyển đến người quản lý
)
SELECT * FROM chainMỗi bước nối CTE trở lại với employees, đi lên một cấp trong cây. Đệ quy tự dừng khi một hàng không có người quản lý nào (JOIN không khớp với hàng nào).
Thử thách
Trung bìnhCác bảng và cột hiện có:
categories:id,name,parent_id
Mỗi danh mục có thể có một parent_id trỏ đến một danh mục khác. Trả về tất cả danh mục là hậu duệ của danh mục id = 1 (con, cháu, …) nhưng không bao gồm chính danh mục 1. Trả về id và name, sắp xếp theo id.
Tự làm thử
WITH RECURSIVE descendants AS (
-- phần gốc: các nút con trực tiếp của id 1
-- phần đệ quy: các nút con của chúng, v.v.
)
SELECT id, name FROM descendants ORDER BY id
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Vượt ra ngoài kiến thức cơ bản
6Công thức phân tích dữ liệu
Top N trong mỗi nhómTỷ lệ trên tổngTổng lũy kếGiữ lại một hàng cho mỗi khóaÔn tập: khách hàng hàng đầuTự luyện tập: Playground SQL