是否可以将单个查询中的多个 CTE 与 arel 结合起来?我正在寻找获得这样结果的方法:
WITH cte1 AS (
...
),
WITH RECURSIVE cte2 AS (
...
),
WITH cte3 AS (
...
)
SELECT ... FROM cte3 WHERE ...
如您所见,我有一个递归 CTE 和两个非递归 CTE。
原文由 axvm 发布,翻译遵循 CC BY-SA 4.0 许可协议
是否可以将单个查询中的多个 CTE 与 arel 结合起来?我正在寻找获得这样结果的方法:
WITH cte1 AS (
...
),
WITH RECURSIVE cte2 AS (
...
),
WITH cte3 AS (
...
)
SELECT ... FROM cte3 WHERE ...
如您所见,我有一个递归 CTE 和两个非递归 CTE。
原文由 axvm 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如公认的答案正确所说,
with子句在每个 CTE 链中仅使用一次。但是,为了完整起见,我想补充 一点,它不会阻止您嵌套 CTE 。If
cte2usescte1,cte3usescte2etc., then the dependency chain between CTEs is linear and it is expressed aswith具有 3 个 CTE。相反,如果是cte2不需要cte1cte3仅在cte3---(with cte3 as (with cte1 as (...), cte2 as (...) select...))。然后 CTE 的语法反映了 CTE 之间的依赖关系树,并从字面上可视化了部分数据集的范围,这可以提高可读性并防止范围泄漏错误。并非所有数据库供应商都支持它,但 Postgres 支持。
例子: