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

CROSS JOIN(交叉连接)

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

CROSS JOIN 创建它所连接的两个表之间的笛卡尔积或交叉积。它不允许指定任何连接谓词。

当一个集合的每个元素需要与另一个集合的每个元素组合时,它是一个在报告中偶尔有用的运算符。例如,当您想要生成一个组合员工和工作日的报告,然后对结果表做一些事情时

SELECT EMPLOYEE.NAME, WEEKDAY.NAME
FROM EMPLOYEE
CROSS JOIN WEEKDAY
 
create.select(EMPLOYEE.NAME, WEEKDAY.NAME)
      .from(EMPLOYEE)
      .crossJoin(WEEKDAY)
      .fetch();

一些示例输出可能是

+---------------+--------------+
| EMPLOYEE.NAME | WEEKDAY.NAME |
+---------------+--------------+
| Jon           | Monday       |
| Jon           | Tuesday      |
| Jon           | Wednesday    |
| Jon           | Thursday     |
| Jon           | Friday       |
| Jon           | Saturday     |
| Jon           | Sunday       |
| Jane          | Monday       |
| Jane          | Tuesday      |
| Jane          | Wednesday    |
| Jane          | Thursday     |
| Jane          | Friday       |
| Jane          | Saturday     |
| Jane          | Sunday       |
| ...           | ...          |
+---------------+--------------+

表列表

请注意,CROSS JOIN 在功能上(但不是语法上)等同于您可以在 FROM 子句 中提供的表列表

SELECT EMPLOYEE.NAME, WEEKDAY.NAME
FROM EMPLOYEE, WEEKDAY
 
create.select(EMPLOYEE.NAME, WEEKDAY.NAME)
      .from(EMPLOYEE, WEEKDAY)
      .fetch();

通常建议优先使用 CROSS JOIN 语法,以便清楚地传达意图。

方言支持

此示例使用 jOOQ

select(BOOK.ID, AUTHOR.ID).from(BOOK.crossJoin(AUTHOR))

翻译成以下特定方言的表达式

ASE

SELECT BOOK.ID, AUTHOR.ID
FROM BOOK
  JOIN AUTHOR
    ON 1 = 1

Aurora MySQL, Aurora Postgres, BigQuery, ClickHouse, CockroachDB, DB2, Databricks, Derby, Exasol, Firebird, H2, HSQLDB, Hana, Informix, MariaDB, MemSQL, MySQL, Oracle, Postgres, Redshift, SQLDataWarehouse, SQLServer, SQLite, Snowflake, Sybase, Teradata, Trino, Vertica, YugabyteDB

SELECT BOOK.ID, AUTHOR.ID
FROM BOOK
  CROSS JOIN AUTHOR

Access, DuckDB

/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL

引用此页

反馈

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

The jOOQ Logo