gpt4 book ai didi

java - 如何在 jOOQ 中的另一个 CTE 中重用一个 CTE

转载 作者:行者123 更新时间:2023-11-30 05:22:55 29 4
gpt4 key购买 nike

在 jOOQ 中,我在以后的 CTE 中重复使用 CTE。我正在尝试按年份和学校汇总学生的完成记录。我正在使用 jOOQ 3.11.2 和 postgres 9.4。

我有有效的 SQL 代码。但是在 jOOQ 中,我返回了空值。

这似乎是我如何在以后的 CTE 中重用一个 CTE 的问题。

一开始我以为可能是count()的使用有问题。从手册来看,count() 的使用似乎是正确的。作为测试,我删除了查询中对 count() 的所有引用,但仍然出现相同的错误。

我找不到在 jOOQ 中重用或链接 CTE 的示例。在 SQL 中很简单,如下所示:SQL - Use a reference of a CTE to another CTE但我还没有掌握 jOOQ 的窍门。

在 Intellij 上以 Debug模式运行时,我看到一个错误,指出无法在第二个 CTE 中评估 select() 语句。

Cannot evaluate org.jooq.impl.SelectImpl.toString()

这是一个展示我正在做的事情的最小示例。

 CommonTableExpression<Record4<String, String, String, Year>> cteOne = name("CteOne")
.fields("SCHOOL","STUDENT_NAME", "COURSE_COMPLETED", "YEAR_COMPLETED")
.as(
select( a.NAME.as("SCHOOL")
, a.STUDENT_NAME
, a.COURSE_DESCRIPTION.as("courseCompleted"),
, a.YEAR_COMPLETED
)
.from(a)
.orderBy(a.YEAR_COMPLETED)
);

CommonTableExpression<Record3<String, Year, Integer >> cteCounts = name("cteCounts")

.fields("SCHOOL", "YEAR_COMPLETED", "NUM_COMPLETED" )

.as( with(cteOne)
.select(
, field(name("cteOne","SCHOOL"), String.class)
, field(name("cteOne","YEAR_COMPLETED"), Year.class)
, count().as("NUM_COMPS_LOGGED")
)
.from(cteOne)
.groupBy(
field(name("cteCompsList","YEAR_COMPLETED"), Year.class)
, field(name("cteOne","SCHOOL"), String.class)
)
.orderBy(
field(name("cteCompsList","YEAR_COMPLETED"), Year.class)
, field(name("cteOne","SCHOOL"), String.class)
)
);

有人可以给我指出正确的方向吗?

最佳答案

就像在查询的纯 SQL 版本中一样,您的 cteCounts 不应包含 with(cteOne) 子句:

WITH 
cteOne (columns...) AS (select...),
cteCounts (columns...) AS (select referencing cteOne, no "with cteOne" here...)
SELECT ...
FROM ...

删除它,您的查询应该没问题

关于java - 如何在 jOOQ 中的另一个 CTE 中重用一个 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59232161/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com