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

ON子句

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

所有的 INNER JOIN, OUTER JOIN, SEMI JOIN, ANTI JOIN 都需要一个连接谓词。

提供连接谓词的一种方式是使用 ON 子句,它提供了最大的灵活性。以下示例展示了如何基于其 FOREIGN KEY 关系“等值连接”作者和书籍表

SELECT *
FROM AUTHOR
JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID
 
create.select()
      .from(AUTHOR)
      .join(BOOK).on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
      .fetch();

但在大多数方言中,任何类型的连接谓词都可以在 ON 中使用,以指定连接操作应生成哪些行。 请注意,虽然对于 INNER JOINON 子句中的谓词和 WHERE 子句 中的谓词具有相同的效果,但这对于所有其他连接类型(包括 OUTER JOIN, SEMI JOIN, ANTI JOIN)来说并非如此。 例如,以下查询将列出所有作者及其书籍,但前提是该书是在 1950 年之前出版的

SELECT *
FROM AUTHOR
LEFT JOIN BOOK
  ON BOOK.AUTHOR_ID = AUTHOR.ID
  AND BOOK.PUBLISHED_IN < 1950
 
create.select()
      .from(AUTHOR)
      .leftJoin(BOOK)
        .on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
        .and(BOOK.PUBLISHED_IN.lt(1950))
      .fetch();

结果可能如下所示

+------------+-----------+--------------+
| FIRST_NAME | LAST_NAME | TITLE        |
+------------+-----------+--------------+
| George     | Orwell    | 1984         |
| George     | Orwell    | Animal Farm  | <-- This author's books were all published before 1950
| Paulo      | Coelho    |              | <-- This author's books were published after 1950
+------------+-----------+--------------+

我们仍然得到所有的作者,但只有满足 ON 谓词的书籍。 这与将该附加谓词放在 WHERE 子句 中非常不同

SELECT *
FROM AUTHOR
LEFT JOIN BOOK
  ON BOOK.AUTHOR_ID = AUTHOR.ID
WHERE BOOK.PUBLISHED_IN < 1950
 
create.select()
      .from(AUTHOR)
      .leftJoin(BOOK)
        .on(BOOK.AUTHOR_ID.eq(AUTHOR.ID))
      .where(BOOK.PUBLISHED_IN.lt(1950))
      .fetch();

结果现在可能看起来像这样

+------------+-----------+--------------+
| FIRST_NAME | LAST_NAME | TITLE        |
+------------+-----------+--------------+
| George     | Orwell    | 1984         |
| George     | Orwell    | Animal Farm  | <-- This author's books were all published before 1950
+------------+-----------+--------------+

现在谓词在连接运算符之后应用,而不是作为连接运算符的一部分,所以它只是一个普通的谓词。

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo