Introduction
Using multiple CTEs helps break down complex queries into smaller, easy-to-understand parts.
Using multiple CTEs helps break down complex queries into smaller, easy-to-understand parts.
WITH cte1 AS ( -- first query ), cte2 AS ( -- second query ) SELECT * FROM cte1 JOIN cte2 ON cte1.id = cte2.id;
WITH first_cte AS ( SELECT id, name FROM users ), second_cte AS ( SELECT user_id, order_total FROM orders ) SELECT first_cte.name, second_cte.order_total FROM first_cte JOIN second_cte ON first_cte.id = second_cte.user_id;
WITH numbers AS ( SELECT generate_series(1,5) AS num ), squares AS ( SELECT num, num * num AS square FROM numbers ) SELECT * FROM squares;
This query uses two CTEs: one for employees and one for departments. Then it joins them to show each employee's department.
WITH employees AS ( SELECT id, name, department_id FROM employee ), departments AS ( SELECT id, department_name FROM department ) SELECT employees.name, departments.department_name FROM employees JOIN departments ON employees.department_id = departments.id ORDER BY employees.name;
CTEs run before the main query and act like temporary tables.
Using multiple CTEs can make your SQL easier to read and maintain.
Multiple CTEs let you split complex queries into smaller parts.
Each CTE is named and separated by commas.
You can join or use CTEs in the final query to get combined results.
cte1 and cte2 in one PostgreSQL query?WITH cte1 AS (SELECT 1 AS num), cte2 AS (SELECT num * 2 AS double_num FROM cte1) SELECT * FROM cte2;
WITH cte1 AS (SELECT id, name FROM users), cte2 AS (SELECT id, age FROM users) SELECT cte1.id, cte1.name, cte2.age FROM cte1 JOIN cte2 ON cte1.id = cte2.user_id;
Pass the test and this pattern moves unknown