【问题标题】:JOOQ/Oracle listAgg with distinctJOOQ/Oracle listAgg 具有不同的
【发布时间】:2021-11-27 14:22:09
【问题描述】:

我正在努力使用 JOOQ DSL 构建以下查询 - 因为我无法将 distinct 关键字引入 JOOQ 生成的查询中。我将如何做到这一点? 在 listAgg 方法后面创建的 ListAgg-Object 将 distinct 的标志作为值,但由于 ListAgg 是包私有的,我无法访问它。有没有办法利用这个标志或任何其他方式来实现这一点?

Oracle SQL

select distinct DATA.*, LISTAGG(distinct ORGANISATIONS.LABEL, ', ') WITHIN GROUP (ORDER BY DATA.ID),
        from DATA
            join ORGANISATIONS
            on DATA.ORG_ID= ORGANISATIONS.ID
        group by DATA.fields()

JOOQ

create.selectDistinct(DATA.asterisk(), listAgg(ORGANISATIONS.LABEL, ", " ).withinGroupOrderBy(DATA.ID).as("ORG_LABELS"))
                .from(DATA)
                .join(ORGANISATIONS).on(DATA.ORG_ID.eq(ORGANISATIONS.ID))
                .groupBy(DATA.fields())
                .fetch()

顺便说一句,表名已被简化。

非常感谢任何意见。

【问题讨论】:

  • 我发现了这个问题:github.com/jOOQ/jOOQ/issues/7104,我相信目前 jOOQ DSL 无法做到这一点。所以你可能想在 GitHub 上添加一个问题

标签: sql oracle distinct jooq


【解决方案1】:

目前还不支持聚合函数,见:https://github.com/jOOQ/jOOQ/issues/7104

您可以使用plain SQL templating 构建自己的:

static Field<String> listAggDistinct(
    Field<String> field, 
    String separator, 
    OrderField<?> orderBy
) {
    return DSL.field(
        "listagg(distinct {0}, {1}) within group (order by {2})",
        field.getDataType(),
        field,
        DSL.inline(separator),
        orderBy
    );
}

【讨论】:

  • 非常感谢您的支持 :)
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 2012-07-15
  • 2021-03-09
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多