MySql 怎么实现 LISTAGG
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql 怎么实现 LISTAGG相关的知识,希望对你有一定的参考价值。
我在Orcle里写了一个Sql语句,用到了LISTAGG,现在要改成mysql数据库,我要怎么改这个Sql语句?
SELECT A.GUID,A.COMPANY_GUID,A.GOODS_CODE,A.GOODS_NAME,A.SPECIFICATIONS,A.SMALL_IMAGE,A.GOODS_UNIT_GUID,A.STATE,A.MARKET_VALUE,A.INTRODUCE,A.INVENTORY,A.ALARM,A.IAMGE_PATH,A.IS_LOSE,A.CREATE_TIME,A.CREATE_USER,A.MODIFY_TIME,A.MODIFY_USER,U.UNIT_NAME AS GOODS_UNIT_NAME
,LISTAGG(B.GUID,''',''') WITHIN GROUP (ORDER BY B.GUID) AS GOODS_TYPE_GUID
FROM B1_GOODS A
LEFT JOIN B1_UNIT U ON U.GUID = A.GOODS_UNIT_GUID
LEFT JOIN B1_GOODS_TYPE_RELATION T ON A.GUID = T.GOODS_GUID
LEFT JOIN B1_GOODS_TYPE B ON T.GOODS_TYPE_GUID = B.GUID
WHERE 1=1
GROUP BY A.GUID,A.COMPANY_GUID,A.GOODS_CODE,A.GOODS_NAME,A.SPECIFICATIONS,A.SMALL_IMAGE,A.GOODS_UNIT_GUID,A.STATE,A.MARKET_VALUE,A.INTRODUCE,A.INVENTORY,A.ALARM,A.IAMGE_PATH,A.IS_LOSE,A.CREATE_TIME,A.CREATE_USER,A.MODIFY_TIME,A.MODIFY_USER,U.UNIT_NAME
ORDER BY A.GUID
请问是在哪个位置加\G?它是什么意思?
JOOQ/Oracle listAgg 具有不同的
【中文标题】JOOQ/Oracle listAgg 具有不同的【英文标题】:JOOQ/Oracle listAgg with distinct 【发布时间】: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 上添加一个问题 【参考方案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
);
【讨论】:
非常感谢您的支持 :)以上是关于MySql 怎么实现 LISTAGG的主要内容,如果未能解决你的问题,请参考以下文章