Bài học theo mô-đun (2/3)
CTE nhiều và được xâu chuỗi
CTE nhiều và chuỗi
Sự sang trọng của biểu thức VỚI thực sự tỏa sáng khi bạn kết hợp nhiều biểu thức lại với nhau. Bạn có thể xác định nhiều CTE liên tiếp, phân tách chúng bằng dấu phẩy.
Và đây là điều mà những người theo chủ nghĩa thuần túy tái cấu trúc yêu thích: các CTE sau này có thể đọc dữ liệu từ các CTE trước đó, giải nén từng phần tính toán tuần tự!
Ví dụ về nhiều CTE
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
),
top_customers AS (
SELECT * FROM premium_customers
WHERE total_spent > 5000
)
SELECT c.first_name, tc.total_spent
FROM customers c
JOIN top_customers tc ON c.id = tc.customer_id;Đó là lập trình kiểu khối! Mỗi khối chỉ thực hiện một công việc.
Xác định hai CTE tuần tự: \n1) 'order_totals' tính toán 'customer_id' và 'order_count' được đặt bằng cách sử dụng `COUNT(*)` từ 'orders'.\n2) 'gold_users' đọc từ 'order_totals' lọc khách hàng với 'order_count >= 2'.\nCuối cùng THAM GIA bảng 'khách hàng' (trích xuất 'first_name' và 'last_name') bằng 'gold_users' (ON c.id = g.customer_id) và cũng hiển thị 'order_count' của họ.
Hiển thị gợi ý
Phân tách order_totals và gold_users bằng dấu phẩy (không có giây VỚI!)
Giải pháp khả dụng sau 3 lần thử
Bây giờ, hãy sử dụng nhiều CTE để đơn giản hóa số liệu: Tạo 'max_price' (trích xuất một hàng có 'max_value' bằng cách sử dụng `MAX(unit_price)` từ 'order_items'). Trong truy vấn chính, trích xuất mọi 'product_id' và 'unit_price' từ 'order_items' và hiển thị mức độ khác biệt của nó so với giá tối đa, tính toán '(CHỌN max_value TỪ max_price) - unit_price AS chênh lệch'. Không tham gia - sử dụng truy vấn con trên CTE để nhận một giá trị duy nhất!
Hiển thị gợi ý
VỚI max_price NHƯ (...) CHỌN sản phẩm_id, đơn vị giá, (CHỌN giá trị tối đa TỪ max_price) - đơn vị giá TỪ order_items;
Giải pháp khả dụng sau 3 lần thử