我正在尝试创建一个模仿以下SQL的JOOQ查询:
select label,orderdate,price
from orders
where (label,orderdate) in (select label,max(orderdate) from orders group by label);
有没有办法在JOOQ中这样做?
使用DSL.row()
构造函数。
DSL.using(configuration)
.select(ORDERS.LABEL, ORDERS.ORDERDATE, ORDERS.PRIC)
.from(ORDERS)
.where(row(ORDERS.LABEL, ORDERS.ORDERDATE)
.in(select(ORDERS.LABEL, max(ORDERS.ORDERDATE))
.from(ORDERS)
.groupBy(ORDERS.LABEL)))
.fetch();
更多信息:https://www.jooq.org/doc/latest/manual/sql-building/conditional-expressions/in-predicate-degree-n
但请注意,如果您的数据库支持窗口函数,则此备用查询可能会更快:
select label, orderdate, price
from (
select
label, orderdate, price,
rank() over (partition by label order by orderdate desc) rk
from orders
) orders
where rk = 1
这也将得到jOOQ的支持
如果你使用的是Oracle,那么最快的解决方案就是使用FIRST
函数(不完全相同:如果每个orderdate
有几行,你只能获得一行):
select
label,
MAX(orderdate) KEEP (DENSE_RANK FIRST ORDER BY orderdate DESC),
MAX(price) KEEP (DENSE_RANK FIRST ORDER BY orderdate DESC)
orders
group by label
这也得到了jOOQ的支持。
More information on these techniques in this article about efficient TOP N queries in SQL