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.