可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12 | 3.11

WITH子句

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

SQL:1999 标准指定 WITH 子句作为 SELECT 语句的可选子句,用于指定公共表表达式(也称为 CTE)。许多其他数据库(例如 PostgreSQL、SQL Server)也允许在其他 DML 子句中使用公共表表达式,例如 INSERT 语句UPDATE 语句DELETE 语句MERGE 语句

当在 jOOQ 中使用公共表表达式时,主要有两种方法

  • 将公共表表达式显式声明和分配给 名称
  • 将公共表表达式内联到 SELECT 语句

显式公共表表达式

以下示例使用 名称来构造公共表表达式,然后可以将其提供给 WITH 子句或 SELECT 语句FROM 子句

-- Pseudo-SQL for a common table expression specification
"t1" ("f1", "f2") AS (SELECT 1, 'a')
// Code for creating a CommonTableExpression instance
name("t1").fields("f1", "f2").as(select(val(1), val("a")));

上面的表达式可以分配给 Java 中的变量,然后用于创建完整的 SELECT 语句






WITH "t1" ("f1", "f2") AS (SELECT 1, 'a'),
     "t2" ("f3", "f4") AS (SELECT 2, 'b')
SELECT
    "t1"."f1" + "t2"."f3" AS "add",
    "t1"."f2" || "t2"."f4" AS "concat"
FROM "t1", "t2"
;
CommonTableExpression<Record2<Integer, String>> t1 =
  name("t1").fields("f1", "f2").as(select(val(1), val("a")));
CommonTableExpression<Record2<Integer, String>> t2 =
  name("t2").fields("f3", "f4").as(select(val(2), val("b")));

Result<?> result2 =
create.with(t1)
      .with(t2)
      .select(
          t1.field("f1").add(t2.field("f3")).as("add"),
          t1.field("f2").concat(t2.field("f4")).as("concat"))
      .from(t1, t2)
      .fetch();

请注意,org.jooq.CommonTableExpression 类型扩展了常用的 org.jooq.Table 类型,因此可以在可以使用表的任何地方使用它。

内联公共表表达式

如果您只是在操作 纯 SQL,您可能不需要保留对此类公共表表达式的中间引用。 这样的用法的一个例子是这个

WITH "a" AS (SELECT
               1 AS "x",
               'a' AS "y"
            )
SELECT
FROM "a"
;
create.with("a").as(select(
                        val(1).as("x"),
                        val("a").as("y")
                   ))
      .select()
      .from(table(name("a")))
      .fetch();

反馈

您对此页面有任何反馈吗? 我们很乐意听到它!

The jOOQ Logo