Skip to main content
Version: Nightly

WITH

Use WITH to specify a Common Table Expression.

What is a Common Table Expression (CTE)?​

A Common Table Expression (CTE) is a temporary result set defined by a WITH clause. The query that follows the clause can reference the CTE multiple times.

Basic syntax of CTE​

CTEs are typically defined using the WITH keyword. The basic syntax is as follows:

WITH cte_name [(column1, column2, ...)] AS (
QUERY
)
SELECT ...
FROM cte_name;

Examples​

Non-recursive CTE​

WITH cte AS (SELECT 0 AS number UNION ALL SELECT 1) SELECT * FROM cte t1, cte t2;
+--------+--------+
| number | number |
+--------+--------+
| 0 | 0 |
| 0 | 1 |
| 1 | 0 |
| 1 | 1 |
+--------+--------+

If a parenthesized list of names follows the CTE name, those names are the column names:

WITH cte (col1, col2) AS
(
SELECT 1, 2
UNION ALL
SELECT 3, 4
)
SELECT col1, col2 FROM cte;

The number of names in the list must be the same as the number of columns in the result set.

+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
+------+------+

Join two CTEs:

WITH
cte1 AS (SELECT 0 AS a UNION ALL SELECT 1),
cte2 AS (SELECT 0 AS b UNION ALL SELECT 1)
SELECT * FROM cte1 JOIN cte2
ON cte1.a = cte2.b;
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 0 | 0 |
+------+------+

Recursive CTE​

A recursive CTE is declared with WITH RECURSIVE. It takes an anchor term, then a recursive term that references the CTE by name:

WITH RECURSIVE counter(n) AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;
+---+
| n |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+---+

The recursion stops when an iteration produces no rows. There is no iteration limit and no cycle detection, so a recursive term that keeps producing rows runs until the query is cancelled.