PostgreSQL Common Table Expressions

Using CTEs (WITH clause)

Basic CTE

WITH high_earners AS (
    SELECT * FROM employees WHERE salary > 100000
)
SELECT * FROM high_earners; # define temporary result set

Multiple CTEs

WITH
    sales_summary AS (
        SELECT product_id, SUM(amount) AS total FROM sales GROUP BY product_id
    ),
    top_products AS (
        SELECT * FROM sales_summary WHERE total > 10000
    )
SELECT * FROM top_products; # chain CTEs

Recursive CTE

WITH RECURSIVE subordinates AS (
    SELECT id, name, manager_id FROM employees WHERE id = 1
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    INNER JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates; # hierarchical query

Modifying CTE

WITH deleted AS (
    DELETE FROM old_orders WHERE date < '2020-01-01'
    RETURNING *
)
SELECT COUNT(*) FROM deleted; # DML in CTE