将此SQL转换为jOOQ

时间:2016-02-05 08:42:56

标签: sql translate jooq

我未能将此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。

1 个答案:

答案 0 :(得分:2)

将此类嵌套查询转换为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)

这意味着您也可以在数据库中为查询的其余部分创建一个视图,并从您的客户端查询该视图。