【问题标题】:Translate this SQL to jOOQ将此 SQL 转换为 jOOQ
【发布时间】:2016-05-15 04:01:28
【问题描述】:

我未能将此 SQL 转换为有效的 jOOQ:

SELECT * FROM product p JOIN
  ( SELECT * FROM
     (SELECT max(product_rev_id) as maxi
      FROM product_rev
      GROUP BY product_id) as a
    JOIN product_rev as t ON t.product_rev_id = maxi
   WHERE valid_to IS NOT NULL 
) as z ON z.product_id = p.product_id 
WHERE p.product_id in(1,2,3,4,5);

这是 SQL-Fiddle: http://sqlfiddle.com/#!9/d7816/1

我尝试了几个小时,但所有别名和 jOOQ 都弄得一团糟。

【问题讨论】:

    标签: sql translate jooq


    【解决方案1】:

    将此类嵌套查询转换为 jOOQ 的最简单方法是将 jOOQ 子查询视为可组合、可重用的元素。即

    // Assuming this
    import static org.jooq.impl.DSL.*;
    
    // Then write the inner-most derived table
    Table<?> a = table(
        select(max(PRODUCT_REV.PRODUCT_REV_ID).as("maxi"))
       .from(PRODUCT_REV)
       .groupBy(PRODUCT_REV.PRODUCT_ID)
    ).as("a");
    
    // Then use a in the middle derived table
    ProductRev t = PRODUCT_REV.as("t");
    Table<?> z = table(
        select()
       .from(a)
       .join(t).on(t.PRODUCT_REV_ID.eq(a.field("maxi", PRODUCT_REV.PRODUCT_REV_ID.getType())))
       .where(t.VALID_TO.isNotNull())
    ).as("z");
    
    // Finally, the outer-most query
    Product p = PRODUCT.as("p");
    DSL.using(configuration)
       .select()
       .from(p)
       .join(z).on(z.field(PRODUCT_REV.PRODUCT_ID).eq(p.PRODUCT_ID))
       .where(p.PRODUCT_ID.in(1, 2, 3, 4, 5))
       .fetch();
    

    替代方案,使用视图

    根据您的查询,我怀疑唯一真正动态的部分是

    WHERE p.product_id in (1, 2, 3, 4, 5)
    

    这意味着您最好在数据库中为其余查询创建一个视图,然后从您的客户端查询该视图。

    【讨论】:

    • 我正在尝试做类似的事情。当我为我自己的一张表输入上面的代码时,我收到 eq(a.field("maxi")) 部分的错误,上面写着“无法解析方法 'eq(org.jooq.Field>)'”你知道我可能会错过什么吗?
    • @ArnoldSpence:感谢您的提示。我的回答并不完全正确。在这种情况下,需要提供数据类型(或者 rawtype 转换也可以)
    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2016-04-11
    • 2014-11-17
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多