Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JOOQ派生表_Java_Sql_Jooq - Fatal编程技术网

Java JOOQ派生表

Java JOOQ派生表,java,sql,jooq,Java,Sql,Jooq,我试图用JOOQ表达以下SQL。然而,我要么在使用派生表的类型方面遇到了巨大的问题,要么得到了可编译的东西,但要么在SQL级别,甚至在JAVA中失败。有人能告诉我如何在这种情况下正确使用派生表吗 SELECT id, ROUND(num_realized / num_requirements, 2) AS realized_percent, ROUND(num_requirements / max_req, 2) AS activity_percent FROM (

我试图用JOOQ表达以下SQL。然而,我要么在使用派生表的类型方面遇到了巨大的问题,要么得到了可编译的东西,但要么在SQL级别,甚至在JAVA中失败。有人能告诉我如何在这种情况下正确使用派生表吗

SELECT
    id,
    ROUND(num_realized / num_requirements, 2) AS realized_percent,
    ROUND(num_requirements / max_req, 2) AS activity_percent
FROM (
    SELECT
        requirement.project_id AS id,
        COUNT(requirement.id) AS num_requirements,
        COUNT(requirement.realized) AS num_realized
    FROM
        requirement
    GROUP BY
        requirement.project_id) AS stats
    CROSS JOIN (
        SELECT
            MAX(num_requirements) AS max_req
        FROM (
            SELECT
                requirement.project_id AS id,
                COUNT(requirement.id) AS num_requirements,
                COUNT(requirement.realized) AS num_realized
            FROM
                requirement
            GROUP BY
                requirement.project_id) AS stats) AS req_max 
在SQL中应用该语句时效果很好,但我无法将该表达式应用到JOOQ中

我最近的一次尝试是使用

Table<Record3<Integer, Integer, Integer>> stats =
DSL.select(
    REQUIREMENT.PROJECT_ID.as("id"),
    DSL.count(REQUIREMENT.ID).as("num_requirements"),
    DSL.count(REQUIREMENT.REALIZED).as("num_realized")
).from(REQUIREMENT).groupBy(REQUIREMENT.PROJECT_ID).asTable("stats");

Table<Record2<Integer, Integer>> req_max =
    DSL.select(
        stats.field(0),
        DSL.min(stats.field(1))
    )
    .from(stats).asTable("req_max");

表格统计信息=
DSL.select(
要求。项目ID.as(“ID”),
DSL.count(REQUIREMENT.ID).as(“num_requirements”),
DSL.count(REQUIREMENT.REALIZED).as(“num_REALIZED”)
).from(REQUIREMENT).groupBy(REQUIREMENT.PROJECT_ID).asTable(“stats”);
表req_max=
DSL.select(
统计字段(0),
DSL.min(统计字段(1))
)
.from(stats).asTable(“请求最大值”);
但是我得到了一个错误:不兼容的类型:

Table<Record2<CAP#1,CAP#2>> cannot be converted to Table<Record2<Integer,Integer>>
表格无法转换为表格
我尝试了一系列不同的技术,包括定义数据类型和使用.field(字符串,数据类型)而不是使用“记录”,但无论我在做什么,它要么不编译,要么在执行未知错误时失败

我很高兴能得到任何帮助。

改用窗口功能 通常,应尽可能避免自联接。在许多情况下,窗口函数可以比嵌套查询中的聚合更优雅地解决问题。如果您使用的是MySQL 8,您的查询可以重新编写为:

选择
需求。项目id作为id,
四舍五入(计数(需求实现)/计数(需求id),2)为实现百分比,
四舍五入(COUNT(requirement.id)/MAX(COUNT(requirement.id))超过(),2)作为活动百分比
从…起
要求
分组
需求.项目id
请注意
MAX(..)OVER()
。我知道您使用的是MySQL 5.7,它还不支持窗口功能,但为了完整起见,这个答案需要一个基于窗口功能的解决方案-可能是升级的动机:-)

通过首先简化底层SQL查询,可以简化许多复杂的jOOQ查询

遇到的派生表问题 问题在于您对and
stats.field(1)
的使用。方法签名是

Field<?> field​(int index)
然后像这样使用它:

var stats =
DSL.select(id, numRequirements, numRealized)
   .from(REQUIREMENT)
   .groupBy(REQUIREMENT.PROJECT_ID)
   .asTable("stats");

var reqMax =
DSL.select(stats.field(id), DSL.max(stats.field(numRequirements)))
   .from(stats)
   .asTable(reqMax);

你用什么方言?MySQL。。。服务器正在运行版本5.7
var stats =
DSL.select(id, numRequirements, numRealized)
   .from(REQUIREMENT)
   .groupBy(REQUIREMENT.PROJECT_ID)
   .asTable("stats");

var reqMax =
DSL.select(stats.field(id), DSL.max(stats.field(numRequirements)))
   .from(stats)
   .asTable(reqMax);