Java jOOQ:“错误:关系CTE不存在”
使用JOOQ3.11.2和Postgres9.4,我试图在定义第二个CTE时重复使用一个JOOQCTE 以下每个StackOverflow问题都不正确 请注意,这不同于定义几个CTE,然后在最终select语句中使用每个CTE,如:Java jOOQ:“错误:关系CTE不存在”,java,sql,common-table-expression,jooq,Java,Sql,Common Table Expression,Jooq,使用JOOQ3.11.2和Postgres9.4,我试图在定义第二个CTE时重复使用一个JOOQCTE 以下每个StackOverflow问题都不正确 请注意,这不同于定义几个CTE,然后在最终select语句中使用每个CTE,如: CommonTableExpression<...> cteAlpha = name(...).fields(...).as(select(...); CommonTableExpression<...> cteBeta = name(.
CommonTableExpression<...> cteAlpha = name(...).fields(...).as(select(...);
CommonTableExpression<...> cteBeta = name(...).fields(...).as(select(...);
List<SomeDTO> list = create
.with(cteAlpha)
.with(cteBeta)
.select(...) from(cteAlpha, cteBeta).fetchInto(SomeDTO.class);
我还没有找到涉及这一点的文档或示例。
如何做到这一点 我在回答我自己的问题。截至2020年1月1日,无法连锁CTE。正如我在评论中指出的,解决方法是使用临时数据库表。对我来说,那是一种代码气味。最后,我解决了更大的问题,简化了代码,不需要解决链接CTE 如果确实使用临时表,请记住在不再需要时删除这些表以防止数据库混乱
请注意,jOOQ是一个维护良好的不断发展的库,在以后的版本中可能会添加它。@LukasEder我发现一个解决方法是将CTE的结果作为临时表持久化。但这是一把双刃剑。使结果更容易可视化,但会使数据库变得混乱,并且需要额外的管理来删除临时文件。我仍然有兴趣知道是否有一个以上问题的答案。也许这不是一个更好的解决方案,但内联CTE会是另一个解决办法吗?我的意思是,如果b需要从a中选择,那么必须设置b将从与a相同的精确定义中选择,而不是从临时名称a中选择。如果有多个嵌套级别,这将变得相当麻烦,但我想我会征求您的建议-这可能会奏效,但我认为它首先违背了定义CTE的目的。使用临时数据库表作为解决方法也是一种代码味道。最后,我从树林里退了一步,看了看树林。更大的问题是验证从许多不同办公室手动输入的摘要报告是否已完全记录。我发现,只需在现有报告图中添加另一个图形系列行,并让用户直观地进行验证,就简单多了。我最终没有在这个解决方案中使用jOOQ。
import static org.jooq.impl.DSL.*;
CommonTableExpression<...> cteOne = name().fields().as(select(...);
CommonTableExpression<...> cteTwo = name().fields().as(select().from(cteOne) ); // seem to need with(cteOne) here.
List<someDTO> result = create
.with(cteOne)
.with(CteTwo)
.select(...)
.from(cteTwo)
.fetchInto(someDTO.class);
CommonTableExpression<...> cteTwo = with(cteOne).name().fields().as(select( ... ).from(cteOne) );
CommonTableExpression<...> cteTwo = name() with(cteOne).fields().as(select( ... ).from(cteOne) );
CommonTableExpression<...> cteTwo = name().fields().with(cteOne).as(select( ... ).from(cteOne) );
CommonTableExpression<...> cteAlpha = name(...).fields(...).as(select(...);
CommonTableExpression<...> cteBeta = name(...).fields(...).as(select(...);
List<SomeDTO> list = create
.with(cteAlpha)
.with(cteBeta)
.select(...) from(cteAlpha, cteBeta).fetchInto(SomeDTO.class);