【问题标题】:Using a WITH inside of a RECURSIVE WITH in PostgreSQL [duplicate]在 PostgreSQL 的 RECURSIVE WITH 中使用 WITH [重复]
【发布时间】:2014-03-17 16:32:39
【问题描述】:

在 PostgreSQL 中,一个 WITH 可以被另一个 WITH 使用,例如:

WITH num AS (
    VALUES (50)
), num2 AS (
    SELECT column1 * 2 AS value FROM num
)
SELECT value FROM num2;

还有 RECURSIVE WITHs,可以这样完成:

WITH RECURSIVE t(n) AS (
    VALUES (1)
  UNION ALL
    SELECT n+1 FROM t WHERE n < 100
)
SELECT sum(n) FROM t;

但到目前为止,我还没有找到一种方法让 RECURSIVE WITH 使用以前的 WITH。我认为应该是这样的:

WITH num AS (
    VALUES (50)
), num2 AS (
    SELECT column1 * 2 AS value FROM num
), RECURSIVE  t(n) AS (
        VALUES (1)
    UNION ALL
        SELECT n+1 FROM t WHERE n < (SELECT * FROM num2)
)
SELECT sum(n) FROM t;

但这不起作用。那么有没有办法做到这一点?如果有,怎么做?

【问题讨论】:

    标签: sql postgresql common-table-expression recursive-query


    【解决方案1】:

    WITH RECURSIVE 开头。您仍然可以在递归部分之前挤入“常规”CTE:

    WITH RECURSIVE
       num  AS (VALUES (50))
    ,  num2 AS (SELECT column1 * 2 AS value FROM num)
    ,  t(n) AS (
          VALUES (1)
          UNION ALL
          SELECT n+1 FROM t WHERE n < (SELECT * FROM num2)
       )
    SELECT sum(n) FROM t;
    

    -> SQLfiddle demo.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2021-12-05
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      相关资源
      最近更新 更多