如何在jooq中创建多列子查询

问题描述 投票:0回答:1

我正在尝试创建一个模仿以下SQL的JOOQ查询:

select label,orderdate,price 
from orders 
where (label,orderdate) in (select label,max(orderdate) from orders group by label);  

有没有办法在JOOQ中这样做?

java sql jooq
1个回答
1
投票

使用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

Alternative using window functions

但请注意,如果您的数据库支持窗口函数,则此备用查询可能会更快:

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 alternative

如果你使用的是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

© www.soinside.com 2019 - 2024. All rights reserved.