Common table expressions

Sometimes it is necessary to use the same subquery multiple times within a complicated query.

A common table expression, or CTE for short, is the tool of choice for these situations.

common-table-expression

WITH RECURSIVE namename ( namename , ) AS ( select-stmtselect-stmt ) , select-stmtselect-stmt insert-stmtinsert-stmt update-stmtupdate-stmt delete-stmtdelete-stmt

Here's a trivial example:

with MyCte(x, y)
as (select 1, 2),
MyOtherCte(z)
as (select 3)
select * from MyCte join MyOtherCte on y + 1 = z

Recursive CTEs

You can also write recursive CTEs, like this example adapted from the SQLite documentation:

WITH RECURSIVE
  xaxis(x) AS (VALUES(-2.0) UNION ALL SELECT x+0.05 FROM xaxis WHERE x<1.2),
  yaxis(y) AS (VALUES(-1.0) UNION ALL SELECT y+0.1 FROM yaxis WHERE y<1.0),
  m(iter, cx, cy, x, y) AS (
    SELECT 0, x, y, 0.0, 0.0 FROM xaxis, yaxis
    UNION ALL
    SELECT iter+1, cx, cy, x*x-y*y + cx, 2.0*x*y + cy FROM m
    WHERE (x*x + y*y) < 4.0 AND iter<28
  ),
  m2(iter, cx, cy) AS (
    SELECT max(iter), cx, cy FROM m GROUP BY cx, cy
  ),
  a(t) AS (
    SELECT group_concat( substr(' .+*#', 1+min(iter/7,4), 1), '')
    FROM m2 GROUP BY cy
  )
SELECT group_concat(rtrim(t),'CRLF') as x FROM a

See it typecheck here.

results matching ""

    No results matching ""