sql - 在 PostgreSQL 的 RECURSIVE WITH 内部使用 WITH

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

<分区>

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

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

然后是 RECURSIVE WITH,可以像这样完成:

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

但到目前为止,我还没有找到让递归 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;

但这行不通。那么有没有办法做到这一点?如果是,怎么办?

最佳答案

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 value FROM num2)
   )
SELECT sum(n) FROM t;

sqlfiddle

参见:

关于sql - 在 PostgreSQL 的 RECURSIVE WITH 内部使用 WITH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21845010/

相关文章:

sql - FULL JOIN with =any 不使用索引

mysql - 如何编写 SQL 查询来检查一个表上的多对多关系是否是另一个表上多对多关系的子集?

ruby-on-rails - postgresql中的数据库连接超时错误

postgresql - 无法访问在 Windows 10 中的 Hyper-V 之上的 Linux Ubuntu 中运行的 PostgreSQL

sql - 使用 CTE 的优点/缺点是什么?

php - 在选择时将 PHP 链接到 Mootools

sql - 将 SQL 转换为 Linq -Where、Group By 和having

带有 dblink 的 postgresql 触发器不返回任何内容

sql-server - 使用 CTE 和分页从 3 个表中获取记录

sql-server - SQL 服务器 : get weekly deposit changes using recursive CTE