使用jOOQ 3.11.2和Postgres 9.4,我试图在第二个CTE的定义中重用一个jOOQ CTE。
对于每个StackOverflow问题How to re-use one CTE in another CTE in jOOQ,以下内容均不正确
CommonTableExpression<...> cteTwo = name().fields().as(select( with(cteOne ... ).from(cteOne) );
基于以上答案,我完全省略了cteTwo中的with(cteOne)子句。我尝试过:
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);
上面的代码可以编译,但运行时出错:'jooq:错误的SQL语法。 ...错误:关系\“ cteOne \”不存在。查看生成的SQL,在cteTwo中没有对cteOne的引用。
然后我尝试将with(cteOne)
子句放在cteTwo定义内的不同位置。在SELECT子句之前只能尝试三个地方。没有一个是正确的:
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) );
请注意,这不同于定义多个CTE,然后在最终的select语句中使用每个CTE,如下所示:
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);
我还没有找到有关此精确点的文档或示例。 应该怎么做?
答案 0 :(得分:1)
我正在回答自己的问题。截至2020年1月1日,不可能将CTE链接起来。正如我在评论中指出的那样,解决方法是使用临时数据库表。就我而言,这是一种代码气味。最终,我解决了更大的问题,简化了我的代码,并且不需要解决链接CTE。
如果确实使用临时表,请记住在不再需要时删除表以防止数据库混乱。
请注意,jOOQ是一个维护良好的不断发展的库,在以后的版本中,可能会添加它。