簡體   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