WITH

使用 WITH 来指定一个公共表表达式(CTE)。

什么是公共表表达式(CTE)?

公共表表达式(CTE)是一个可以在 SELECTINSERTUPDATEDELETE 语句中引用的临时结果集。CTE 有助于将复杂的查询分解成更易读的部分,并且可以在同一个查询中多次引用。

CTE 的基本语法

CTE 通常使用 WITH 关键字定义。基本语法如下:

  1. WITH cte_name [(column1, column2, ...)] AS (
  2. QUERY
  3. )
  4. SELECT ...
  5. FROM cte_name;

示例

非递归 CTE

  1. WITH cte AS (SELECT number FROM numbers LIMIT 2) SELECT * FROM cte t1, cte t2;
  1. +--------+--------+
  2. | number | number |
  3. +--------+--------+
  4. | 0 | 0 |
  5. | 0 | 1 |
  6. | 1 | 0 |
  7. | 1 | 1 |
  8. +--------+--------+

如果 CTE 名称后面有一个括起来的名称列表,这些名称就是 CTE 的列名,可以在查询里使用:

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

列表中的名称数量必须与结果集中的列数相同。

  1. +------+------+
  2. | col1 | col2 |
  3. +------+------+
  4. | 1 | 2 |
  5. | 3 | 4 |
  6. +------+------+

联合查询两个 CTE:

  1. WITH
  2. cte1 AS (SELECT number AS a FROM NUMBERS LIMIT 2),
  3. cte2 AS (SELECT number AS b FROM NUMBERS LIMIT 2)
  4. SELECT * FROM cte1 JOIN cte2
  5. ON cte1.a = cte2.b;
  1. +------+------+
  2. | a | b |
  3. +------+------+
  4. | 1 | 1 |
  5. | 0 | 0 |
  6. +------+------+

递归 CTE

递归 CTE 目前尚未实现。