Common Table Expression (CTE)

Description

A common table expression (CTE) defines a temporary result set that a user can reference possibly multiple times within the scope of a SQL statement. A CTE is used mainly in a SELECT statement.

Syntax

  1. WITH common_table_expression [ , ... ]

While common_table_expression is defined as

  1. expression_name [ ( column_name [ , ... ] ) ] [ AS ] ( query )

Parameters

  • expression_name

    Specifies a name for the common table expression.

  • query

    A SELECT statement.

Examples

  1. -- CTE with multiple column aliases
  2. WITH t(x, y) AS (SELECT 1, 2)
  3. SELECT * FROM t WHERE x = 1 AND y = 2;
  4. +---+---+
  5. | x| y|
  6. +---+---+
  7. | 1| 2|
  8. +---+---+
  9. -- CTE in CTE definition
  10. WITH t AS (
  11. WITH t2 AS (SELECT 1)
  12. SELECT * FROM t2
  13. )
  14. SELECT * FROM t;
  15. +---+
  16. | 1|
  17. +---+
  18. | 1|
  19. +---+
  20. -- CTE in subquery
  21. SELECT max(c) FROM (
  22. WITH t(c) AS (SELECT 1)
  23. SELECT * FROM t
  24. );
  25. +------+
  26. |max(c)|
  27. +------+
  28. | 1|
  29. +------+
  30. -- CTE in subquery expression
  31. SELECT (
  32. WITH t AS (SELECT 1)
  33. SELECT * FROM t
  34. );
  35. +----------------+
  36. |scalarsubquery()|
  37. +----------------+
  38. | 1|
  39. +----------------+
  40. -- CTE in CREATE VIEW statement
  41. CREATE VIEW v AS
  42. WITH t(a, b, c, d) AS (SELECT 1, 2, 3, 4)
  43. SELECT * FROM t;
  44. SELECT * FROM v;
  45. +---+---+---+---+
  46. | a| b| c| d|
  47. +---+---+---+---+
  48. | 1| 2| 3| 4|
  49. +---+---+---+---+
  50. -- If name conflict is detected in nested CTE, then AnalysisException is thrown by default.
  51. -- SET spark.sql.legacy.ctePrecedencePolicy = CORRECTED (which is recommended),
  52. -- inner CTE definitions take precedence over outer definitions.
  53. SET spark.sql.legacy.ctePrecedencePolicy = CORRECTED;
  54. WITH
  55. t AS (SELECT 1),
  56. t2 AS (
  57. WITH t AS (SELECT 2)
  58. SELECT * FROM t
  59. )
  60. SELECT * FROM t2;
  61. +---+
  62. | 2|
  63. +---+
  64. | 2|
  65. +---+