mysql - 使用 DISTINCT 关键字将 GROUP_CONCAT 查询从 MySQL 转换为 H2 很困难

标签 mysql sql h2

我正在尝试让之前在 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_AGGLISTAGG、如果 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/

相关文章:

java - 如何将带有 UNIQUE INDEX 关键字的行从 mySql 转换为 H2

database - H2数据库写复杂存储过程

mysql - 同一 Mysql 数据库的两个实例之间的加入顺序不同

mysql - 月数的嵌套 SQL 查询

mysql - 返回 id,其中两个字段之一与某个值匹配,但仅返回该值以外的字段

java - 为什么 H2 在自动创建模式之前尝试在数据库中加载数据?

php - 如何在 Controller 中使用 Laravel 查询创建

mysql - zend 框架中国际网络应用程序的时区

sql - 从 SQL 查询中排除结果 - 按面积或人口计算,但不能同时计算(异或)

mysql - 存储两个单词的最佳数据类型?