mysql - H2 抱怨语法错误,MySQL 接受它 - 但是,错误的语法给出了正确的结果:列 ... 必须在 GROUP BY 列表中;
问题描述
注意:对问题进行了编辑以包含表格并显示结果的确切预期。
假设我们有一个通过以下方式生成的 SQL 表:
CREATE TABLE T1 (
`a` INTEGER,
`b` DATETIME,
`c` VARCHAR(5)
);
INSERT INTO T1
(`a`, `b`, `c`)
VALUES
('5678', '2008-01-01 12:00', '12.34'),
('5678', '2008-01-01 12:01', NULL),
('5678', '2008-01-01 12:02', NULL),
('5678', '2008-01-01 12:03', '23.45'),
('5678', '2008-01-01 12:04', NULL);
我需要执行的是
SELECT * FROM(
SELECT a, b, c from T1
)AS Q GROUP BY c ORDER BY a, b;
这使:
5678 2008-01-01 12:00:00 12.34
5678 2008-01-01 12:01:00 NULL
5678 2008-01-01 12:03:00 23.45
H2 建议(并接受)的是
SELECT * FROM(
SELECT a, b, c from T1
)AS Q GROUP BY a,b,c ORDER BY a, b, c;
这使
5678 2008-01-01 12:00:00 12.34
5678 2008-01-01 12:01:00 NULL
5678 2008-01-01 12:02:00 NULL
5678 2008-01-01 12:03:00 23.45
5678 2008-01-01 12:04:00 NULL
根据您的一些建议,这些是查询和结果。
建议一:
SELECT max(a) as a, max(b) as b, c
FROM (
SELECT a, b, c from T1
) AS Q
GROUP BY c
ORDER BY a, b;
给
5678 2008-01-01 12:00:00 12.34
5678 2008-01-01 12:03:00 23.45
5678 2008-01-01 12:04:00 NULL
建议二:
SELECT *
FROM (
SELECT a, b, c from T1
) AS Q
GROUP BY c, a, b
ORDER BY a, b;
给
5678 2008-01-01 12:00:00 12.34
5678 2008-01-01 12:01:00 NULL
5678 2008-01-01 12:02:00 NULL
5678 2008-01-01 12:03:00 23.45
5678 2008-01-01 12:04:00 NULL
=======================================
我需要获取第一个查询执行的结果。
在获得所需结果的同时,我应该如何正确更改语法以适应 H2 需求?
解决方案
现在,对于修改后的问题。根据样本数据,在 H2 中您可以执行以下操作:
select t1.*
from t1
join (
select c, min(b) as min_b from t1 group by c
) x on t1.c is not distinct from x.c and t1.b = x.min_b
order by t1.b;
结果:
A B C
---- --------------------- ------
5678 2008-01-01 12:00:00.0 12.34
5678 2008-01-01 12:01:00.0 <null>
5678 2008-01-01 12:03:00.0 23.45
重现该案例的示例数据脚本是:
create table t1 (
a integer,
b datetime,
c varchar(5)
);
insert into t1 (a, b, c) values
('5678', timestamp '2008-01-01 12:00:00', '12.34'),
('5678', timestamp '2008-01-01 12:01:00', null),
('5678', timestamp '2008-01-01 12:02:00', null),
('5678', timestamp '2008-01-01 12:03:00', '23.45'),
('5678', timestamp '2008-01-01 12:04:00', null);
推荐阅读
- php - WooCommerce API 获取用户信息
- android - 转换 YUV byte[] 以在 WebRTC 中使用
- c# - 如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”
- javascript - useState 未显示中间步骤
- apache-kafka - Kafka 多租户消费者
- python - CSS 选择器在浏览器控制台中有效,但在 Python 中无效
- swift - 在 tableview 中对动态部分进行排序 | 迅速
- python - 当我开始循环时,循环得到 0,0,1,2,3.. 而不是 0,1,2,3
- html - Bootstrap 使所有列等于最大 col-auto 宽度
- react-native - 更新 graphql 列中的 JSON 数据