Biểu thức thông thường (Common Table Expressions – CTE) là một tính năng hữu ích trong PostgreSQL. Sử dụng CTE giúp tách biệt các phần phức tạp của truy vấn, làm rõ logic, và dễ dàng bảo trì mã. Người dùng nên cân nhắc sử dụng CTE trong các trường hợp sau đây.
1. Truy vấn lặp đi lặp lại
Khi một phần của câu truy vấn được lặp đi lặp lại nhiều lần, bạn có thể sử dụng CTE để viết nó một lần và tái sử dụng.
Ví dụ:
-- vnengineer
WITH EmployeeSalaries AS (
SELECT
employee_id,
salary
FROM
employees
)
SELECT
employee_id,
salary
FROM
EmployeeSalaries
WHERE
salary > 50000;
2. Làm rõ logic trong truy vấn phức tạp
Khi câu truy vấn chứa nhiều biểu thức phức tạp, dùng CTE có thể giúp bạn chia nhỏ và dễ dàng theo dõi logic.
Ví dụ:
-- vnengineer
WITH FilteredOrders AS (
SELECT
order_id,
customer_id,
order_date
FROM
orders
WHERE
order_date > '2022-01-01'
),
RecentOrders AS (
SELECT
*
FROM
FilteredOrders
WHERE
order_date > '2022-06-01'
)
SELECT
*
FROM
RecentOrders;
3. Sử dụng CTE để thực hiện đệ quy
CTE đệ quy là một trong những cách hiệu quả để duyệt qua các cây hoặc đồ thị trong cơ sở dữ liệu.
Ví dụ về truy vấn đệ quy để tìm kiếm tất cả các cấp dưới của một nhân viên:
-- vnengineer
WITH RECURSIVE Subordinates AS (
SELECT
employee_id,
manager_id
FROM
employees
WHERE
manager_id = 1
UNION ALL
SELECT
e.employee_id,
e.manager_id
FROM
employees e
INNER JOIN
Subordinates s ON s.employee_id = e.manager_id
)
SELECT
employee_id
FROM
Subordinates;
4. Khi hiệu năng không phải là ưu tiên chính
CTE trong PostgreSQL không phải lúc nào cũng tối ưu về mặt hiệu năng, nhưng nó giúp cải thiện tính dễ đọc và bảo trì của mã.
Ví dụ:
-- vnengineer
WITH Summary AS (
SELECT
customer_id,
SUM(total_amount) AS total_spent
FROM
orders
GROUP BY
customer_id
)
SELECT
customer_id,
total_spent
FROM
Summary
WHERE
total_spent > 1000;
Kết luận
Việc sử dụng các biểu thức thông thường trong PostgreSQL không chỉ giúp bạn tổ chức và quản lý các truy vấn phức tạp một cách rõ ràng hơn, mà còn cung cấp công cụ mạnh mẽ để xử lý các vấn đề như đệ quy. Tuy nhiên, cần lưu ý rằng CTE có thể ảnh hưởng đến hiệu năng và không phải lúc nào cũng là lựa chọn tốt nhất. Hãy cân nhắc kỹ lưỡng về yêu cầu cụ thể của bản thân trước khi quyết định sử dụng CTE.