我正在尝试让之前在 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"
现实中的查询是通过编程生成的,但该示例捕获了其目的。是的,我知道在所有列和表名称周围使用引号来容纳潜在的空间并不理想,但这是我目前必须使用的方法。
问题在于,H2 似乎没有解释 DISTINCT
关键字,至少不像 MySQL 的解释方式那样。在 H2 中,它连接所有聚合值,无论它们是否不同。例如,在上面的示例查询之后,两个重复的 Id
条目被连接起来,这不是我想要的行为。
在下表设置上运行上述 SELECT
查询说明了该问题:
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 的帮助将不胜感激。
最佳答案
这是 H2 1.4.200 及更早版本中的错误,DISTINCT
不适用于有序聚合函数(ARRAY_AGG
、LISTAGG
、如果 whey 有 ORDER BY
子句,则为 LISTAGG
提供特定于供应商的别名。
已修复,该修复将包含在 H2 1.4.201 中。
要立即获取修复程序,您可以在 GitHub 上下载当前源代码:
https://github.com/h2database/h2database
使用带有 jar
目标的构建脚本,如下所述:
https://h2database.com/html/build.html#building
不要使用 H2 的 Maven 版本,它只是实验性的,不会生成功能齐全的 jar。
关于mysql - 使用 DISTINCT 关键字将 GROUP_CONCAT 查询从 MySQL 转换为 H2 很困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59149491/