我有一个讨厌的SQl,我想在JOOQ转换
以下是查询:
SELECT
SUM(dpr.dpr_bruttopraemie_prt + dpr.dpr_sofortrabatt_prt)
, MAX(TO_NUMBER(DP1.dp_wert))
FROM deckungen deck, deckungspraemien dpr,
(SELECT dp.dp_id, dp.dp_wert
FROM textbausteine txb, druckparameter dp
WHERE dp.dp_txb_id = txb.txb_id
) DP1
WHERE DP1.dp_id = :druckparameter_id;
如您所见,我需要从包含两个Fields的select中创建别名。
dp.dp_id, dp.dp_wert
即将在其他部分使用它。
我怎么能完成它?
我见过
.asField()
Funktion但它只为一列提供别名。
PS:实际的查询要复杂得多。所以我写了一个更简单的。 希望它能满足SQL ORACLE Dialect。
答案 0 :(得分:2)
我假设您正在使用代码生成器,因此您已为DECKUNGEN
生成了可用于表的对象。我还假设您正在使用这些静态导入:
import static org.jooq.impl.DSL.*; // The jOOQ API
import static com.example.myapp.generated.Tables.*; // Your generated tables
然后你可以写:
Deckungen deck = DECKUNGEN.as("deck");
Deckungspraemien dpr = DECKUNGSPRAEMIEN.as("dpr");
Textbausteine txb = TEXTBAUSTEINE.as("txb");
Druckparameter dp = DRUCKPARAMETER.as("dp");
Table<?> dp1 = table(
select(dp.DP_ID, dp.DP_WERT)
.from(txb, dp)
.where(dp.DP_TXB_ID.eq(txb.TXB_ID))
).as("dp1");
Record2<BigDecimal, BigDecimal> result =
using(configuration)
.select(
sum(dpr.DPR_BRUTTOPRAEMIE_PRT.plus(dpr.DPR_SOFORTRABATT_PRT)),
max(field("to_number({0})", BigDecimal.class, dp1.field(dp.DP_WERT))))
.from(deck, dpr, dp1)
.where(dp1.field(dp.DP_ID).eq(druckparameterId))
.fetchOne();
TO_NUMBER()
功能,但您可以使用DSL.field(String)
和类似的重载轻松推出自己的功能。有关详细信息,请refer to the manual's section about plain SQL DSL.table(Select)
运算符可以最轻松地创建派生表。Table.field()
方法取消引用,特别是Table.field(Field)
,它试图找到与参数字段同名的字段,保留参数字段&#39;类型信息。我不认为您的查询是正确的,因为您只是在表deck
,dpr
和dp1
之间创建笛卡尔积。具体来说,SUM()
很可能是错误的,而MAX()
的计算效率很低。