【问题标题】:Alias with two Fields using JOOQ使用 JOOQ 的具有两个字段的别名
【发布时间】:2017-08-28 18:43:35
【问题描述】:

我有一个讨厌的 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;

如您所见,我需要从带有两个字段的选择中创建别名。

dp.dp_id, dp.dp_wert 

我打算在其他部分使用它。

我怎样才能完成它?

我见过

.asField() 

Funktion 但它只为一列创建别名。

PS:实际的查询要复杂得多。所以我写了一个更简单的。 希望它满足 SQL ORACLE 方言。

【问题讨论】:

    标签: java jooq


    【解决方案1】:

    我假设您正在使用代码生成器,因此您已经生成了可用于您的表的对象,例如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();
    

    一些解释

    旁注

    我认为您的查询不正确,因为您只是在表 deckdprdp1 之间创建笛卡尔积。具体来说,SUM() 很可能是错误的,而MAX() 的计算效率很低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-06
      • 2021-11-25
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2011-01-15
      • 2011-10-17
      • 2021-06-01
      相关资源
      最近更新 更多