WITH子句
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
SQL:1999 标准指定 WITH
子句作为 SELECT 语句的可选子句,用于指定公共表表达式(也称为 CTE)。许多其他数据库(例如 PostgreSQL、SQL Server)也允许在其他 DML 子句中使用公共表表达式,例如 INSERT 语句、UPDATE 语句、DELETE 语句或 MERGE 语句。
当在 jOOQ 中使用公共表表达式时,主要有两种方法
显式公共表表达式
-- 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();
反馈
您对此页面有任何反馈吗? 我们很乐意听到它!