Biểu thức Bảng Phổ biến (CTE) là gì?
Biểu thức bảng chung (CTE) là tập hợp kết quả của một truy vấn tồn tại tạm thời và chỉ để sử dụng trong ngữ cảnh của một truy vấn lớn hơn. Giống như một bảng dẫn xuất, kết quả của một CTE không được lưu trữ và chỉ tồn tại trong thời gian truy vấn. Bài viết này sẽ tập trung vào các CTE không lặp lại.
CTE hữu ích như thế nào?
CTE, giống như dạng xem cơ sở dữ liệu và bảng dẫn xuất, cho phép người dùng dễ dàng viết và duy trì các truy vấn phức tạp thông qua việc tăng khả năng đọc và đơn giản hóa. Việc giảm độ phức tạp này đạt được bằng cách giải cấu trúc các truy vấn thông thường phức tạp thành các khối đơn giản để sử dụng và sử dụng lại nếu cần, khi viết lại truy vấn. Các trường hợp sử dụng ví dụ bao gồm:
- Cần tham chiếu một bảng dẫn xuất nhiều lần trong một truy vấn duy nhất
- Một giải pháp thay thế để tạo chế độ xem trong cơ sở dữ liệu
- Thực hiện cùng một phép tính nhiều lần trên nhiều thành phần truy vấn
Cách tạo CTE
- Bắt đầu một CTE bằng cách sử dụng “WITH”
- Cung cấp tên cho truy vấn sắp được xác định kết quả
- Sau khi chỉ định tên, hãy theo dõi bằng “AS”
- Chỉ định tên cột (bước tùy chọn)
- Xác định truy vấn để tạo ra tập kết quả mong muốn
- Nếu yêu cầu nhiều CTE, hãy bắt đầu mỗi biểu thức tiếp theo bằng dấu phẩy và lặp lại các bước 2-4.
- Tham chiếu (các) CTE được xác định ở trên trong một truy vấn tiếp theo
Cú pháp
WITH
expression_name_1 AS
(CTE query definition 1)
[, expression_name_X AS
(CTE query definition X)
, etc ]
SELECT expression_A, expression_B, ...
FROM expression_name_1
## CTET Ví dụ Truy vấn sau trả lời câu hỏi kinh doanh:"chi phí trung bình hàng tháng cho mỗi chiến dịch cho các nỗ lực tiếp thị của công ty là bao nhiêu?" Điều này có thể được thực hiện với một truy vấn dẫn xuất (được hiển thị bên dưới); tuy nhiên, sử dụng CTE cải thiện khả năng đọc
-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)
-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign
Sử dụng truy vấn dẫn xuất:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
-- this is where the derived query is used
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign
Tài liệu
- Postgres
- Dịch chuyển đỏ
- Oracle
- SQLServer