Concept Flow - Multiple CTEs in one query
Define CTE1
Define CTE2
→Use CTE1 and CTE2 in main query
End
First, you define multiple CTEs one after another. Then, you use them together in the main query to get the final result.
WITH cte1 AS (SELECT 1 AS num), cte2 AS (SELECT 2 AS num) SELECT cte1.num + cte2.num AS sum FROM cte1, cte2;
| Step | Action | CTE1 Content | CTE2 Content | Main Query Result |
|---|---|---|---|---|
| 1 | Define cte1 | [{num:1}] | N/A | N/A |
| 2 | Define cte2 | [{num:1}] | [{num:2}] | N/A |
| 3 | Execute main query joining cte1 and cte2 | [{num:1}] | [{num:2}] | [{sum:3}] |
| 4 | Return final result | [{num:1}] | [{num:2}] | [{sum:3}] |
| Variable | Start | After Step 1 | After Step 2 | Final |
|---|---|---|---|---|
| cte1 | undefined | [{num:1}] | [{num:1}] | [{num:1}] |
| cte2 | undefined | undefined | [{num:2}] | [{num:2}] |
| main_query_result | undefined | undefined | undefined | [{sum:3}] |
Multiple CTEs let you define several temporary named result sets separated by commas. Use WITH cte1 AS (...), cte2 AS (...) before the main query. Then refer to these CTEs like tables in your main SELECT. This helps organize complex queries step-by-step. All CTEs must be defined before the main query runs.
cte1 and cte2 in one SQL query?name AS (query).WITH cte1 AS (SELECT 1 AS num UNION ALL SELECT 2), cte2 AS (SELECT num FROM cte1 WHERE num = 2) SELECT * FROM cte2;
WITH cte1 AS (SELECT id, name FROM users) SELECT * FROM cte1; WITH cte2 AS (SELECT id FROM orders) SELECT * FROM cte2;
Pass the test and this pattern moves unknown