Một dãy số
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 20 trên 27.
Bạn đã gặp từ khóa (keyword) WITH trong Fundamentals để đặt tên cho truy vấn con, còn gọi là CTE (Common Table Expression). CTE đệ quy tiến thêm một bước: nó cho phép truy vấn con tham chiếu đến chính nó, tạo dần kết quả theo từng hàng.
Phiên bản đơn giản nhất tạo ra một dãy số mà không cần bảng nền. Cấu trúc luôn giống nhau:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- khởi đầu: hàng bắt đầu
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- đệ quy: tạo hàng tiếp theo từ hàng trước đó
)
SELECT n FROM counterĐọc như sau: bắt đầu với n = 1, sau đó tiếp tục thêm hàng, trong đó mỗi n bằng n + 1 trước đó, và dừng khi WHERE không còn khớp. Kết quả là 1, 2, 3, 4, 5.
Hai phần của thân truy vấn được nối bằng UNION ALL. Phần đầu tiên là phần gốc: các hàng khởi tạo. Phần thứ hai là bước đệ quy: phần này truy vấn chính CTE.
Thử thách
DễViết một CTE đệ quy có tên powers với hai cột:
i: chỉ số lần lặp, bắt đầu từ1p:2lũy thừai(2,4,8, …)
Dừng khi p vượt quá 1000. Trả về cả hai cột, sắp xếp theo i tăng dần.
Tự làm thử
WITH RECURSIVE powers(i, p) AS (
-- khởi đầu: i=1, p=2
-- đệ quy: i+1, p*2, cho đến khi p đạt 1000
)
SELECT i, p FROM powers ORDER BY i
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