当前位置: 首页 > 知识库问答 >
问题:

jOOQ子查询的顺序为

蒋波光
2023-03-14
select * from series 
order by (select max(competition.competition_date) from competition 
          where competition.series_id = series.id) desc

我尝试了以下查询,但没有编译:

dsl
   .selectFrom(SERIES)
   .orderBy(dsl.select(DSL.max(COMPETITION.COMPETITION_DATE))
               .from(COMPETITION).where(COMPETITION.SERIES_ID.eq(SERIES.ID)).desc())
   .fetch()

order BY不支持子查询吗?

共有1个答案

林绪
2023-03-14

有一个挂起的特性请求#4828,让选择 extend Field 。这似乎很诱人,因为jOOQ已经在某种程度上支持嵌套记录,以支持它的方言。

但是我怀疑在这种情况下这是否真的是一个好主意,因为我所知道的数据库(即我尝试过的数据库)都不支持投射多个列的标量子查询。可以在行值表达式谓词中使用这样的子查询,例如。

(a, b) IN (SELECT x, y FROM t)

但这是另一回事,因为它仅限于谓词,而不是任意的列表达式。并且jOOQ已经通过各种dsl.row()重载支持它。

java prettyprint-override">row(A, B).in(select(T.X, T.Y).from(T))
    null

你已经找到了正确的答案。虽然select > 不能扩展字段 ,但我们可以接受select<?在大量API中扩展record1 > ,作为通常的tfield 重载的重载。这是偶尔做过的,可能在整个API中做得更彻底:https://github.com/jooq/jooq/issues/7240。

这对您没有帮助,因为您希望对列表达式调用.desc()(select),而不是将其封装传递给一个方法,因此我们又回到了前面提到的Java的限制。

但是,如果您使用的是Kotlin或其他语言,这些语言可以提供某种“扩展函数”,那么您可以使用以下方法:

inline fun <T> Select<Record1<T>>.desc(): SortField<T> {
    return DSL.field(this).desc();
}
 类似资料:
  • 问题内容: 在MySQL中执行子句的预定义顺序是什么?它是否在运行时确定,并且此顺序正确吗? 问题答案: MySQL语句的实际执行有些棘手。但是,该标准确实指定了查询中元素解释的顺序。这基本上是在您指定的顺序,但我想和能来后: 条款 条款 条款 条款 条款 条款 这对于了解如何解析查询很重要。例如,您不能使用在子句中的定义的列别名,因为会在之前解析。另一方面,这样的别名可以在子句中。 至于实际执行

  • 我需要从一个非常大的表中选择一个“页”的数据。由于WHERE子句和需要分页到相当大的偏移量,我使用一个子查询来获取ID。只有在末尾放置时,此策略才有效。这导致(我认为)到数据库的额外往返。有什么方法可以避免额外的? 附言。我这样做的原因是由于orderBy/offset/limit用于大偏移量(我选择的列之一由于是blob类型,不适合添加到索引中,所以我不能创建覆盖索引)。

  • 我如何写问题。*在jooq中而不是指定所有实体vaiables

  • 我有一个由字符串表示的查询: 这里的问题是,我实际上是在执行两个查询。这就引入了开销。 是否可以将string-query作为真正的子查询执行?不知何故,我必须将字符串查询转换为实例(我猜),但我找不到如何做到这一点。

  • 问题内容: 假设我将与关联的表存储如下(代表事件的时间戳): 这样我们可以说: 用户1具有ADBCB的事件序列 用户2具有事件序列BBAAC 我想针对这些用户回答的问题类型非常容易表达为事件序列的常规表达式,例如“哪些用户的事件序列与A. * B匹配?” 或“哪些用户的事件序列与A [^ C] * B [^ C] * D匹配?” 等等。 在此表结构上可以用来回答类似查询的SQL技巧或运算符是什么?

  • 问题内容: 假设我有一个查询“ select * from子句,其中id在(0,2,5,1,3)中”,我实际上希望返回的行以它们在where子句中指定的相同顺序返回。ID的顺序将随查询的不同而改变,并且该顺序没有模式。 我知道可以更改数据模型,创建临时表等。但是请相信我,这些类型的解决方案在我的情况下将行不通。我也无法在应用程序代码中更改结果对象的顺序。 我还知道,不同的数据库引擎对事物的排序方式