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

ON KEY子句

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

ON KEY 子句可能会迅速产生歧义,因为复杂连接树中两个表之间的隐式键路径并不总是唯一的。即使是过去有效的查询,也可能会因为向表中添加了新的 FOREIGN KEY 约束而停止工作。请谨慎使用此子句!

所有 INNER JOINOUTER JOINSEMI JOINANTI JOIN 都需要连接谓词。

提供此连接谓词的一种方法是使用 ON KEY 子句,它允许基于它们的 FOREIGN KEY 关系方便地连接两个表,前提是相关的元数据通过 代码生成 为 jOOQ 所知

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

这个 onKey() 方法有不同的重载。当两个连接表之间没有歧义路径时,上面的方法适用。如果有几个 FOREIGN KEY 声明(例如,一本书有一个 AUTHOR_ID 和一个 CO_AUTHOR_ID),那么您可以将 org.jooq.ForeignKey 引用传递给该方法,以解决歧义。

SELECT *
FROM AUTHOR
JOIN BOOK ON BOOK.AUTHOR_ID = AUTHOR.ID
 
create.select()
      .from(AUTHOR)
      .join(BOOK).onKey(Keys.FK_BOOK_AUTHOR)
      .fetch();

通过使用 FOREIGN KEY 信息在表之间进行连接的类似方法是 隐式 JOIN,它提供了从子表到父表的基于路径的导航表达式。与 ON KEY 语法不同,隐式连接永远不会遇到歧义。

反馈

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

The jOOQ Logo