WITH子句

本节提供对公共表表达式的支持 (CTE),所以结果 WITH 子句可以在其余部分中使用 SELECT 查询。

限制

  1. 不支持递归查询。
  2. 当在section中使用子查询时,它的结果应该是只有一行的标量。
  3. Expression的结果在子查询中不可用。

示例1: 使用常量表达式作为 “variable”

  1. WITH '2019-08-01 15:23:00' as ts_upper_bound
  2. SELECT *
  3. FROM hits
  4. WHERE
  5. EventDate = toDate(ts_upper_bound) AND
  6. EventTime <= ts_upper_bound

示例2: 从SELECT子句列表中逐出sum(bytes)表达式结果

  1. WITH sum(bytes) as s
  2. SELECT
  3. formatReadableSize(s),
  4. table
  5. FROM system.parts
  6. GROUP BY table
  7. ORDER BY s

例3: 使用标量子查询的结果

  1. /* this example would return TOP 10 of most huge tables */
  2. WITH
  3. (
  4. SELECT sum(bytes)
  5. FROM system.parts
  6. WHERE active
  7. ) AS total_disk_usage
  8. SELECT
  9. (sum(bytes) / total_disk_usage) * 100 AS table_disk_usage,
  10. table
  11. FROM system.parts
  12. GROUP BY table
  13. ORDER BY table_disk_usage DESC
  14. LIMIT 10

例4: 在子查询中重用表达式

作为子查询中表达式使用的当前限制的解决方法,您可以复制它。

  1. WITH ['hello'] AS hello
  2. SELECT
  3. hello,
  4. *
  5. FROM
  6. (
  7. WITH ['hello'] AS hello
  8. SELECT hello
  9. )
  1. ┌─hello─────┬─hello─────┐
  2. ['hello'] ['hello']
  3. └───────────┴───────────┘