使用 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_AGGLISTAGG 和供应商特定别名中不起作用 LISTAGG) 如果乳清有 ORDER BY 子句。

已修复,修复将包含在 H2 1.4.201 中。

要立即获得修复,您可以在 GitHub 上下载当前源代码: https://github.com/h2database/h2database 使用带有 jar 目标的构建脚本,如下所述: https://h2database.com/html/build.html#building

不要使用 H2 的 Maven 构建,它只是实验性的,不会生成功能齐全的 jar。