是否可以将单个查询中的多个 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 许可协议
1 回答2.4k 阅读✓ 已解决
3 回答2.3k 阅读
1 回答2.3k 阅读✓ 已解决
2 回答961 阅读
正如公认的答案正确所说,
with
子句在每个 CTE 链中仅使用一次。但是,为了完整起见,我想补充 一点,它不会阻止您嵌套 CTE 。If
cte2
usescte1
,cte3
usescte2
etc., then the dependency chain between CTEs is linear and it is expressed aswith
具有 3 个 CTE。相反,如果是cte2
不需要cte1
cte3
仅在cte3
---
(with cte3 as (with cte1 as (...), cte2 as (...) select...)
)。然后 CTE 的语法反映了 CTE 之间的依赖关系树,并从字面上可视化了部分数据集的范围,这可以提高可读性并防止范围泄漏错误。并非所有数据库供应商都支持它,但 Postgres 支持。
例子: