使用 DISTINCT 关键字难以将 GROUP_CONCAT 查询从 MySQL 转换为 H2
Difficulty converting GROUP_CONCAT query from MySQL to H2 with DISTINCT keyword
我正在尝试获取以前与 MySQL 一起使用的查询以使用 H2。该查询完全按照 MySQL 中的需要进行(当双引号被反引号替换时)。具体如下:
SELECT GROUP_CONCAT(DISTINCT "Id" ORDER BY "Id" SEPARATOR ' ') "Id",
GROUP_CONCAT(DISTINCT "Course" ORDER BY "Id" SEPARATOR ' ') "Course",
GROUP_CONCAT("Day/s" ORDER BY "Id" SEPARATOR ' ') "Day/s",
"Sect",
"Class Nbr"
FROM SAMPLE
GROUP BY "Class Nbr", "Sect"
现实中的查询是以编程方式生成的,但该示例捕获了其目的。是的,我知道在所有列和 table 名称周围使用引号来容纳潜在的空间并不理想,但这是我目前必须使用的方法。
问题是 H2 似乎没有解释 DISTINCT
关键字,至少不像 MySQL 那样解释它。在 H2 中,它连接所有聚合值,无论它们是否不同。例如,在上面的示例查询之后,两个重复的 Id
条目被连接起来,这不是我想要的行为。
运行 上述 SELECT
对以下 table 设置的查询说明了问题:
CREATE TABLE SAMPLE("Id" VARCHAR(255), "Course" VARCHAR(255), "Day/s" VARCHAR(255), "Sect" VARCHAR(255), "Class Nbr" VARCHAR(255));
INSERT INTO SAMPLE VALUES (1, 'class1', 'M W F', 1134, 553);
INSERT INTO SAMPLE VALUES (2, 'class1', 'T R', 1134, 553);
INSERT INTO SAMPLE VALUES (3, 'class2', 'T R', 1111, 444);
结果是:
Id | Course | Day/s | Sect | Class Nbr
---------------------------------------
3 | class2 | T R | 1111 | 444
---------------------------------------
1 2 | class1 class1 | M W F T R | 1134 | 553
而我希望结果是 MySQL:
Id | Course | Day/s | Sect | Class Nbr
---------------------------------------
3 | class2 | T R | 1111 | 444
---------------------------------------
1 2 | class1 | M W F T R | 1134 | 553
如果能帮助将此查询移植到 H2,我们将不胜感激。
我不确定您的引擎如何解释您的 sql 语法。但我可以看到,您的分组是基于聚合列 "Class Nbr"
。尝试删除它。
使用 MySQL GROUP_CONCAT: (see dbfiddle)
SELECT GROUP_CONCAT(DISTINCT `Id`ORDER BY `Id` SEPARATOR ' ') `Id`
, GROUP_CONCAT( `Course` ORDER BY `Id` SEPARATOR ' ') `Course`
, GROUP_CONCAT( `Day/s` ORDER BY `Id` SEPARATOR ' ') `Day/s`
, `Sect`
, GROUP_CONCAT(DISTINCT `Class Nbr` ORDER BY `Id` SEPARATOR ' ') as `Class Nbr`
FROM `sample_sheet_Copy`
GROUP BY `Sect`
将 ListAgg 与 Distinct 结合使用:
SELECT LISTAGG( "Id", ' ' DISTINCT) WITHIN GROUP (ORDER BY "Id") "Id"
, LISTAGG("Course", ' ') WITHIN GROUP (ORDER BY "Id") "Course"
, LISTAGG("Day/s", ' ') WITHIN GROUP (ORDER BY "Id") "Day/s"
, "Sect"
, LISTAGG("Class Nbr", ' ' DISTINCT) WITHIN GROUP (ORDER BY "Id") as "Class Nbr"
FROM "sample_sheet_Copy"
GROUP BY "Sect"
这是 H2 1.4.200 及更早版本中的错误,DISTINCT
在有序聚合函数(ARRAY_AGG
、LISTAGG
和供应商特定别名中不起作用 LISTAGG
) 如果乳清有 ORDER BY
子句。
已修复,修复将包含在 H2 1.4.201 中。
要立即获得修复,您可以在 GitHub 上下载当前源代码:
https://github.com/h2database/h2database
使用带有 jar
目标的构建脚本,如下所述:
https://h2database.com/html/build.html#building
不要使用 H2 的 Maven 构建,它只是实验性的,不会生成功能齐全的 jar。
我正在尝试获取以前与 MySQL 一起使用的查询以使用 H2。该查询完全按照 MySQL 中的需要进行(当双引号被反引号替换时)。具体如下:
SELECT GROUP_CONCAT(DISTINCT "Id" ORDER BY "Id" SEPARATOR ' ') "Id",
GROUP_CONCAT(DISTINCT "Course" ORDER BY "Id" SEPARATOR ' ') "Course",
GROUP_CONCAT("Day/s" ORDER BY "Id" SEPARATOR ' ') "Day/s",
"Sect",
"Class Nbr"
FROM SAMPLE
GROUP BY "Class Nbr", "Sect"
现实中的查询是以编程方式生成的,但该示例捕获了其目的。是的,我知道在所有列和 table 名称周围使用引号来容纳潜在的空间并不理想,但这是我目前必须使用的方法。
问题是 H2 似乎没有解释 DISTINCT
关键字,至少不像 MySQL 那样解释它。在 H2 中,它连接所有聚合值,无论它们是否不同。例如,在上面的示例查询之后,两个重复的 Id
条目被连接起来,这不是我想要的行为。
运行 上述 SELECT
对以下 table 设置的查询说明了问题:
CREATE TABLE SAMPLE("Id" VARCHAR(255), "Course" VARCHAR(255), "Day/s" VARCHAR(255), "Sect" VARCHAR(255), "Class Nbr" VARCHAR(255));
INSERT INTO SAMPLE VALUES (1, 'class1', 'M W F', 1134, 553);
INSERT INTO SAMPLE VALUES (2, 'class1', 'T R', 1134, 553);
INSERT INTO SAMPLE VALUES (3, 'class2', 'T R', 1111, 444);
结果是:
Id | Course | Day/s | Sect | Class Nbr
---------------------------------------
3 | class2 | T R | 1111 | 444
---------------------------------------
1 2 | class1 class1 | M W F T R | 1134 | 553
而我希望结果是 MySQL:
Id | Course | Day/s | Sect | Class Nbr
---------------------------------------
3 | class2 | T R | 1111 | 444
---------------------------------------
1 2 | class1 | M W F T R | 1134 | 553
如果能帮助将此查询移植到 H2,我们将不胜感激。
我不确定您的引擎如何解释您的 sql 语法。但我可以看到,您的分组是基于聚合列 "Class Nbr"
。尝试删除它。
使用 MySQL GROUP_CONCAT: (see dbfiddle)
SELECT GROUP_CONCAT(DISTINCT `Id`ORDER BY `Id` SEPARATOR ' ') `Id`
, GROUP_CONCAT( `Course` ORDER BY `Id` SEPARATOR ' ') `Course`
, GROUP_CONCAT( `Day/s` ORDER BY `Id` SEPARATOR ' ') `Day/s`
, `Sect`
, GROUP_CONCAT(DISTINCT `Class Nbr` ORDER BY `Id` SEPARATOR ' ') as `Class Nbr`
FROM `sample_sheet_Copy`
GROUP BY `Sect`
将 ListAgg 与 Distinct 结合使用:
SELECT LISTAGG( "Id", ' ' DISTINCT) WITHIN GROUP (ORDER BY "Id") "Id"
, LISTAGG("Course", ' ') WITHIN GROUP (ORDER BY "Id") "Course"
, LISTAGG("Day/s", ' ') WITHIN GROUP (ORDER BY "Id") "Day/s"
, "Sect"
, LISTAGG("Class Nbr", ' ' DISTINCT) WITHIN GROUP (ORDER BY "Id") as "Class Nbr"
FROM "sample_sheet_Copy"
GROUP BY "Sect"
这是 H2 1.4.200 及更早版本中的错误,DISTINCT
在有序聚合函数(ARRAY_AGG
、LISTAGG
和供应商特定别名中不起作用 LISTAGG
) 如果乳清有 ORDER BY
子句。
已修复,修复将包含在 H2 1.4.201 中。
要立即获得修复,您可以在 GitHub 上下载当前源代码:
https://github.com/h2database/h2database
使用带有 jar
目标的构建脚本,如下所述:
https://h2database.com/html/build.html#building
不要使用 H2 的 Maven 构建,它只是实验性的,不会生成功能齐全的 jar。