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 JOIN,ON
子句中的谓词和 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 +------------+-----------+--------------+
现在谓词在连接运算符之后应用,而不是作为连接运算符的一部分,所以它只是一个普通的谓词。
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!