Java JOOQ派生表
我试图用JOOQ表达以下SQL。然而,我要么在使用派生表的类型方面遇到了巨大的问题,要么得到了可编译的东西,但要么在SQL级别,甚至在JAVA中失败。有人能告诉我如何在这种情况下正确使用派生表吗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 (
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查询
遇到的派生表问题
问题在于您对andstats.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);