繁体   English   中英

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

[英]How do you create a multi-column subquery in jooq

我试图进行模仿以下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替代

如果使用的是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也支持此功能。

有关SQL中有效TOP N查询的本文中有关这些技术的更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM