You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写JOOQ查询以选取在ActiveSubscribers中无关联的Subscription记录

问题

如何编写JOOQ查询语句,select所有Subscription条目,满足ActiveSubscribers.subscriptionId不存在于Subscriptions表中?

涉及的两张表结构如下:

+-------------------+   +----------------------+
|  Subscriptions    |   |  ActiveSubscribers   |
+-------------------+   +----------------------+
| Id   |    Name    |   | Id   | SubcriptionId |
|-------------------|   |----------------------|
| 1    |  Dogs      |   | 1    |   1           |
| 2    |  Cats      |   | 2    |   2           |
| 3    |  Hamsters  |   +----------------------+
+-------------------+

预期查询结果:

+-------------------+
| 3    |  Hamsters  |
+-------------------+

原有代码问题说明

你提交的尝试代码有两个明显错误:

  • 主查询from指定的表名错误,应该是Subscriptions而非Subscribers
  • 子查询from指定的表名错误,应该是ActiveSubscribers而非Subscribers

正确实现方案

方案1:使用NOT IN语法(和你原有写法逻辑对齐,修改错误即可)

List<Subscription> nonActiveSubscriptions = DSL.using(connection)
    .select()
    .from(DSL.table("Subscriptions"))
    .where(DSL.field("Id").notIn(
        DSL.select(DSL.field("ActiveSubscribers.SubcriptionId"))
            .from(DSL.table("ActiveSubscribers"))
    ))
    .fetch()
    .into(Subscription.class);

方案2:使用NOT EXISTS语法(处理空值时更稳妥,性能通常更优)

List<Subscription> nonActiveSubscriptions = DSL.using(connection)
    .select()
    .from(DSL.table("Subscriptions"))
    .where(DSL.notExists(
        DSL.selectOne()
            .from(DSL.table("ActiveSubscribers"))
            .where(DSL.field("ActiveSubscribers.SubcriptionId").eq(DSL.field("Subscriptions.Id")))
    ))
    .fetch()
    .into(Subscription.class);

内容的提问来源于stack exchange,提问作者JumbledCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:45:02