我需要在select语句中使用SUM聚合函数,而不需要连接和分组语句。
这是我的代码的一部分:
dslContext.select(
T_DAILY_DIAGRAM.DAILY_DIAGRAM_ID.convertFrom(DailyDiagramId::of),
T_DAILY_DIAGRAM.BALANCING_GROUP_ID.convertFrom(BalancingGroupId::of),
T_DAILY_DIAGRAM.DIAGRAM_DATE,
row(
T_DAILY_DIAGRAM_REVISION.DAILY_DIAGRAM_REVISION_ID.convertFrom(DailyDiagramRevisionId::of),
T_DAILY_DIAGRAM_REVISION.REVISION_NUMBER,
T_DAILY_DIAGRAM_REVISION.PROPAGATION_STATUS.convertFrom(DailyDiagramRevisionPropagationStatus::valueOf),
multiset(
select(
sum(T_DAILY_DIAGRAM_PERIOD.PRODUCTION).as("production")
).from(T_DAILY_DIAGRAM_PERIOD).where(T_DAILY_DIAGRAM_PERIOD.FK_DAILY_DIAGRAM_REVISION_ID.eq(T_DAILY_DIAGRAM_REVISION.ID))
).convertFrom(p -> p == null || p.isEmpty() ? null : (BigDecimal) p.getValue(0, "production")),
row(
T_DAILY_DIAGRAM_REVISION.CREATED_AT,
T_DAILY_DIAGRAM_REVISION.CREATED_BY,
T_DAILY_DIAGRAM_REVISION.UPDATED_AT,
T_DAILY_DIAGRAM_REVISION.UPDATED_BY
).convertFrom(Records.mapping(MetadataResponse::newWithoutVersion))
).convertFrom(Records.mapping(DailyDiagramRevisionListResponse::new)),
row(
T_DAILY_DIAGRAM.CREATED_AT,
T_DAILY_DIAGRAM.CREATED_BY,
T_DAILY_DIAGRAM.UPDATED_AT,
T_DAILY_DIAGRAM.UPDATED_BY,
T_DAILY_DIAGRAM.VERSION
).convertFrom(Records.mapping(MetadataResponse::newWithoutCA))
)
.from(T_DAILY_DIAGRAM)
.join(T_DAILY_DIAGRAM_REVISION).on(T_DAILY_DIAGRAM_REVISION.FK_DAILY_DIAGRAM_ID.eq(T_DAILY_DIAGRAM.ID).and(T_DAILY_DIAGRAM_REVISION.CLOSING_TIME.isNull()))
.where(
T_DAILY_DIAGRAM.BALANCING_GROUP_ID.eq(balancingGroupId.id().get())
.and(T_DAILY_DIAGRAM.DIAGRAM_DATE.between(startDate, endDate)))
.fetch(Records.mapping(DailyDiagramListResponse::new));
这个解决方案对我有用,但它是丑陋的解决方案。
MULTISET
太棒了,人们想在任何地方使用它。但在这种特殊情况下,我想一个简单的标量、相关子查询就足够了(就像普通的 SQL 一样)
field(
select(sum(T_DAILY_DIAGRAM_PERIOD.PRODUCTION))
.from(T_DAILY_DIAGRAM_PERIOD)
.where(T_DAILY_DIAGRAM_PERIOD.FK_DAILY_DIAGRAM_REVISION_ID
.eq(T_DAILY_DIAGRAM_REVISION.ID))
).as("production")
请注意,从 jOOQ 3.19 开始,有一个名为 隐式路径相关 的新功能,它将通过让您省略相关性的
WHERE
子句来简化此类子查询:
field(
select(sum(T_DAILY_DIAGRAM_REVISION.tDailyDiagramPeriod().PRODUCTION))
.from(T_DAILY_DIAGRAM_REVISION.tDailyDiagramPeriod())
).as("production")