【问题标题】:jooq query for sql query with analytical functionjooq query for sql查询,带分析功能
【发布时间】:2020-10-04 15:44:51
【问题描述】:

我有类似的 sql 查询

select *
from (
   select s.*, max(year) over () max_year
   from Transaction s
   where s.Account_Number     = '4234242234'
     and s.month in (0,1)) o
where o.year=o.max_year;

我需要用 jOOQ 编写,任何帮助。 我尝试了以下

dslContext.select(Transaction.BANK,
                    Transaction.ACCOUNT,
                    Transaction.AMOUNT,
                    max(Transaction.YEAR).over())
            .from(Transaction)
            .where(Transaction.BANK.eq(bank))
            .and(Transaction.MONTH.in((byte) 0, (byte) 1))
            .fetchInto(Transaction.class);

另外,有什么方法可以避免列出 select 中的所有列。而不是

select(Transaction.BANK,
       Transaction.ACCOUNT,
       Transaction.AMOUNT,
       max(Transaction.YEAR).over())

类似

select(Transaction.*,
       max(Transaction.YEAR).over())

【问题讨论】:

    标签: java sql oracle jooq


    【解决方案1】:

    派生表可以这样构造:

    // Assuming this static import, as always:
    import static org.jooq.impl.DSL.*;
    
    // Create aliased column expression for later reuse
    Field<Integer> maxYear = max(Transaction.YEAR).over().as("max_year");
    
    // Create derived table
    Table<?> o = select(Transaction.asterisk(), maxYear)
                .from(Transaction)
                .where(Transaction.BANK.eq(bank))
                .and(Transaction.MONTH.in((byte) 0, (byte) 1))
                .asTable("o");
    
    // Use derived table and dereference fields from it using Table.field(Field)
    ctx.select()
       .from(o)
       .where(o.field(Transaction.YEAR).eq(o.field(maxYear)))
       .fetch();
    

    另外,有什么办法可以避免列出 select 中的所有列

    您正在寻找 Table.asterisk() 以在 SQL 中生成星号,或寻找 Table.fields() 以从您生成的代码中生成所有字段。

    【讨论】:

      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多