派生列列表
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
SQL标准规定了如何一次性重命名表及其列(别名)。它引用了以下语法的术语“派生列列表”
SELECT t.a, t.b FROM ( SELECT 1, 2 ) t(a, b)
此功能在各种用例中非常有用,在这些用例中列名事先未知(但表的度数是已知的!)。这方面的一个例子是解嵌套表,或者VALUES() 表构造函数
-- Unnested tables SELECT t.a, t.b FROM unnest(my_table_function()) t(a, b) -- VALUES() constructor SELECT t.a, t.b FROM VALUES(1, 2),(3, 4) t(a, b)
只有少数数据库真正支持这样的语法,但幸运的是,jOOQ 可以使用 UNION ALL 和一个指定新列名的空虚拟记录轻松地模拟它。以下两个语句是等效的
-- Using derived column lists SELECT t.a, t.b FROM ( SELECT 1, 2 ) t(a, b) -- Using UNION ALL and a dummy record SELECT t.a, t.b FROM ( SELECT null a, null b FROM DUAL WHERE 1 = 0 UNION ALL SELECT 1, 2 FROM DUAL ) t
在 jOOQ 中,您可以简单地指定一个 varargs 列别名列表,如下所示
// Unnested tables
create.select().from(unnest(myTableFunction()).as("t", "a", "b")).fetch();
// VALUES() constructor
create.select().from(values(
row(1, 2),
row(3, 4)
).as("t", "a", "b"))
.fetch();
方言支持
此示例使用 jOOQ
selectFrom(values(row(1, 2)).as("t", "a", "b"))
翻译成以下特定方言的表达式
访问
SELECT t.a, t.b
FROM (
SELECT
1 a,
2 b
FROM (
SELECT count(*) dual
FROM MSysResources
) AS dual
) t
ASE, Redshift, SQLDataWarehouse, Vertica
SELECT t.a, t.b FROM ( SELECT 1, 2 ) t (a, b)
Aurora MySQL, MemSQL
SELECT t.a, t.b
FROM (
SELECT
1 a,
2 b
FROM DUAL
) t
Aurora Postgres, CockroachDB, DB2, Databricks, Derby, DuckDB, Exasol, H2, HSQLDB, Oracle, Postgres, SQLServer, Snowflake, Trino, YugabyteDB
SELECT t.a, t.b FROM ( VALUES (1, 2) ) t (a, b)
BigQuery
SELECT t.a, t.b
FROM (
SELECT
null a,
null b
FROM UNNEST([STRUCT(1 AS dual)]) AS dual
WHERE FALSE
UNION ALL
SELECT *
FROM UNNEST ([ STRUCT (1, 2)]) t
) t
ClickHouse, MariaDB
SELECT t.a, t.b
FROM (
SELECT
1 a,
2 b
) t
Firebird
SELECT t.a, t.b FROM ( SELECT 1, 2 FROM RDB$DATABASE ) t (a, b)
Hana
SELECT t.a, t.b
FROM (
SELECT
1 a,
2 b
FROM SYS.DUMMY
) t
Informix
SELECT t.a, t.b
FROM (
TABLE (MULTISET { ROW (1, 2)})
) t (a, b)
MySQL
SELECT t.a, t.b FROM ( VALUES ROW (1, 2) ) t (a, b)
SQLite
SELECT t.a, t.b
FROM (
SELECT
null a,
null b
WHERE 1 = 0
UNION ALL
SELECT *
FROM (
VALUES (1, 2)
) t
) t
Sybase
SELECT t.a, t.b FROM ( SELECT 1, 2 FROM SYS.DUMMY ) t (a, b)
Teradata
SELECT t.a, t.b
FROM (
SELECT 1, 2
FROM (
SELECT 1 AS "dual"
) AS "dual"
) t (a, b)
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL
反馈
您对此页面有任何反馈吗?我们很乐意听到您的意见!