首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jOOQ:如何解决在跨多个表连接时为<column>`找到的“`Ambiguous匹配”?

jOOQ:如何解决在跨多个表连接时为<column>`找到的“`Ambiguous匹配”?
EN

Stack Overflow用户
提问于 2020-08-07 01:25:02
回答 1查看 810关注 0票数 1

下面的jOOQ查询在我的日志中发出一个SQL警告:Fields Ambiguous match found for id

代码语言:javascript
复制
db.select(FORWARDED_MESSAGE.SES_MESSAGE_ID).
  from(FORWARDED_MESSAGE).
  where(
    FORWARDED_MESSAGE.FORWARDED.lt( DSL.currentTimestamp().subtract(
      FORWARDED_MESSAGE.mailMapping().mailKeyword().mailDomain().account().
        MESSAGE_RETENTION_DAYS ))).
  fetch(FORWARDED_MESSAGE.SES_MESSAGE_ID);

生成的SQL似乎是正确的,但我不希望这个警告会污染我的日志(我还想知道jOOQ是否警告了我一些我需要注意的重要事项)。

有关模式表的一些上下文:

  • forwarded_message没有主key
  • mail_domain使用自然的PK名为"domain"
  • mail_mappingmail_keywordaccount都有一个名为id

的PK

我尝试了以下方法,但是它没有成功地说出Key ambiguous between tables

代码语言:javascript
复制
db.select(FORWARDED_MESSAGE.SES_MESSAGE_ID).
  from(FORWARDED_MESSAGE).
    join(MAIL_MAPPING).onKey().
    join(MAIL_KEYWORD).onKey().
    join(MAIL_DOMAIN).onKey().
    join(ACCOUNT).onKey().
  where(
    FORWARDED_MESSAGE.FORWARDED.lt(
      DSL.currentTimestamp().subtract(ACCOUNT.MESSAGE_RETENTION_DAYS) )).
  fetch(FORWARDED_MESSAGE.SES_MESSAGE_ID);

jOOQ版本是3.13.4,DB是postgres,使用pgjdbc 42.2.14

问题

如何解析Fields Ambiguous match found警告?

注意:这不是How to resolve ambiguous match when chaining generated Jooq classes的欺骗,因为这是关于子类歧义的问题--这个问题是关于连接的简单链接(跨具有重复PK列的表)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-07 01:34:40

通过将查询重写为join().onKey()样式,但显式地指定联接外键,我就可以消除警告。

这有点冗长,但似乎很有效:

代码语言:javascript
复制
db.select(FORWARDED_MESSAGE.SES_MESSAGE_ID).
  from(FORWARDED_MESSAGE).
    join(MAIL_MAPPING).
      onKey(Keys.FORWARDED_MESSAGE__FORWARDED_MESSAGE_MAIL_MAPPING_ID_FKEY).
    join(MAIL_KEYWORD).onKey(Keys.MAIL_MAPPING__MAIL_MAPPING_MAIL_KEYWORD_ID_FKEY).
    join(MAIL_DOMAIN).onKey(Keys.MAIL_KEYWORD__MAIL_KEYWORD_DOMAIN_FKEY).
    join(ACCOUNT).onKey(Keys.MAIL_DOMAIN__MAIL_DOMAIN_MAIL_DOMAIN_ACCOUNT_ID_FKEY).
  where(
    FORWARDED_MESSAGE.FORWARDED.lt(
      DSL.currentTimestamp().subtract(ACCOUNT.MESSAGE_RETENTION_DAYS) )).
  fetch(FORWARDED_MESSAGE.SES_MESSAGE_ID);

不知道为什么这与FORWARDED_MESSAGE.mailMapping()...account()风格有很大不同。但是它可以工作,生成的SQL也更干净。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63293919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档