首页 > 解决方案 > 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 需求?

标签: mysqlsyntaxsyntax-errorh2

解决方案


现在,对于修改后的问题。根据样本数据,在 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);

推荐阅读