单个查询中的多个 CTE

新手上路,请多包涵

是否可以将单个查询中的多个 CTE 与 arel 结合起来?我正在寻找获得这样结果的方法:

 WITH cte1 AS (
...
),
WITH RECURSIVE cte2 AS (
...
),
WITH cte3 AS (
...
)
SELECT ... FROM cte3 WHERE ...

如您所见,我有一个递归 CTE 和两个非递归 CTE。

原文由 axvm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 930
1 个回答

正如公认的答案正确所说, with 子句在每个 CTE 链中仅使用一次。但是,为了完整起见,我想补充 一点,它不会阻止您嵌套 CTE

If cte2 uses cte1 , cte3 uses cte2 etc., then the dependency chain between CTEs is linear and it is expressed as with 具有 3 个 CTE。相反,如果是 cte2 不需要 cte1 cte3 仅在 cte3 ---with cte3 as (with cte1 as (...), cte2 as (...) select...) )。

然后 CTE 的语法反映了 CTE 之间的依赖关系树,并从字面上可视化了部分数据集的范围,这可以提高可读性并防止范围泄漏错误。并非所有数据库供应商都支持它,但 Postgres 支持。

例子:

 with cte1(id,capital) as (
  values(1,'Prague'),(2,'Bratislava')
), cte2(id,code) as (
  with cte2inner1(id,code) as (
    values(1,'CZ'),(2,'SK')
  ), cte2inner2(id,country) as (
    values(1,'Czech Republic'),(2,'Slovakia')
  )
  select id,country from cte2inner1 join cte2inner2 using (id)
)
select *
from cte1 join cte2 using (id)
--join cte2inner1  not possible here

原文由 Tomáš Záluský 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进