JOOQ:使用 WITH 子句创建子查询(使用纯 SQL)

Posted

技术标签:

【中文标题】JOOQ:使用 WITH 子句创建子查询(使用纯 SQL)【英文标题】:JOOQ : Creating subqueries using WITH clause (using plain SQL) 【发布时间】:2021-11-09 20:30:08 【问题描述】:

我在使用带有“普通 SQL 查询”的“WITH”子句生成子查询时遇到问题。用例是我有一个 SQL,我只想将它用作 with 子查询并在此基础上创建一个查询。

例子:

我有疑问:

"SELECT a,b,c FROM T"

我要创作:

WITH "t1" as ( SELECT a,b,c FROM T ) 
SELECT a,b FROM "t1";

我正在尝试使用 DSL.with(...) 但它只需要 SelectStep 或 CTE。我还注意到我们无法使用纯 SQL 创建 CTE。如果有任何方法可以实现这一点,请提供帮助。提前致谢。

【问题讨论】:

【参考方案1】:

从 jOOQ 3.15 开始,WithAsStep.as() 方法将ResultQuery 作为参数,而不仅仅是Select。这意味着您可以包装 DSL.resultQuery(String)(即 "plain SQL template")。随便写:

ctx.with(name("t1"))
   .as(resultQuery("SELECT a, b, c FROM t"))
   .select(field(unquotedName("a")), field(unquotedName("b")))
   .from(name("t1"))
   .fetch();

假设一如既往,这个静态导入:

import static org.jooq.impl.DSL.*;

【讨论】:

感谢@Lukas,我看到它是最近添加的,在旧版本(如果有的话)中实现这一目标的其他方法是什么? @tolani:是什么阻止了你升级? 没什么,升级了@Lukas

以上是关于JOOQ:使用 WITH 子句创建子查询(使用纯 SQL)的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ 删除并加入

如何使用 Laravel Eloquent 创建子查询?

使用 peewee 创建子查询,在子查询结果上使用 `.select`

无法在 Kotlin/Java 中使用 jooq DSL 执行 where 子句

Jooq ARRAY_AGG where 子句

Spring Boot with JOOQ 和 Spring Data JPA 之间的技术差异