如何在jOOQ中重用一个CTE

时间:2019-12-08 03:23:37

标签: java sql common-table-expression jooq

在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上以调试模式运行时,我看到一个错误,无法在第二个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)
                    )
    );

有人可以为此指出正确的方向吗?

1 个答案:

答案 0 :(得分:0)

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

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

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