如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值

Posted

技术标签:

【中文标题】如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值【英文标题】:JOOQ query to return a boolean if all rows based on a field has different value on another field 【发布时间】:2021-12-01 23:59:15 【问题描述】:

我正在编写一个 JOOQ 查询。例如我有这张桌子

ID Name Status
1 Erick Single
2 James Single
3 Erick Single
4 Erick Married

我想检查是否所有“Erick”都是“Single”。在这种情况下,它应该返回 false。

我尝试了这个 JOOQ 查询,我猜它有效:

return !context.fetchExists(
        context.selectFrom(TABLE_NAME)
        .where(TABLE_NAME.NAME.eq("Erick"),
                TABLE_NAME.STATUS.ne("Single"))
        ));

还有更优雅的方法吗?我的目标是在指针遇到“已婚”的“Erick”时立即返回,同时查询可读。

【问题讨论】:

【参考方案1】:

你的方法很好,但我猜你真的在寻找the EVERY aggregate function!

return context.fetchValue(
    select(every(TABLE_NAME.STATUS.eq("Single")))
    .from(TABLE_NAME)
    .where(TABLE_NAME.NAME.eq("Erick"))
);

甚至这个。这可能比上面的要慢,具体取决于您的 RDBMS 是否仍然可以为此使用索引,但您的实际查询可能更复杂,and you might need to aggregate multiple values in one go:

return context.fetchValue(
    select(every(TABLE_NAME.STATUS.eq("Single"))
        .filterWhere(TABLE_NAME.NAME.eq("Erick")))
    .from(TABLE_NAME)
);

【讨论】:

以上是关于如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值的主要内容,如果未能解决你的问题,请参考以下文章

求oracle中查询关联查询不同数据在另一表作为相同字段的对应的值

如果 PIG 中的第二个字段具有不同的值,如何过滤/删除记录

MySQL GROUP BY ...具有不同的值相同的字段

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

如果有一个字段的值应该有不同的类型怎么办?

如果另一个字段具有使用对象数组的值,则有条件地要求字段