H2抱怨错误的语法,MySQL接受它-然而,错误的语法给出了正确的结果:列。。。必须在“分组依据”列表中;

H2抱怨错误的语法,MySQL接受它-然而,错误的语法给出了正确的结果:列。。。必须在“分组依据”列表中;,mysql,syntax,syntax-error,h2,Mysql,Syntax,Syntax Error,H2,注:问题经过编辑以包括表格,并显示预期结果 假设我们有一个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-0

注:问题经过编辑以包括表格,并显示预期结果

假设我们有一个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建议(并接受)的是

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

根据您的一些建议,以下是查询和结果

建议1:

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;
SELECT * 
FROM (
  SELECT a, b, c from T1
) AS Q 
GROUP BY c, a, b 
ORDER BY a, b;
给予

建议2:

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;
SELECT * 
FROM (
  SELECT a, b, c from T1
) AS Q 
GROUP BY c, a, b 
ORDER BY a, b;
给予

======================================

我需要获得第一个查询执行的结果


如何正确更改语法以适应H2需求,同时获得所需的结果?

H2运行正常。根据ANSI/ISO SQL和几乎所有其他SQL实现(SQLite除外),旧版本的MySQL允许执行查询,即使查询无效

我写了一个例子来解释它

必须更正查询才能使用H2

规则是select列表的每一列必须位于聚合函数内,或者在GROUPBY子句中命名

你可以这样解决:

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;
这符合规则,因为
a
b
在聚合函数中,而
c
组中


MySQL 5.7及更高版本默认为行为正确,通过语义强制组。

您可能正在使用MySQL 5.7.5或更高版本,用于接受此类查询。如果您使用的是较新的MySQL,则可能启用了旧的/格式错误的语法

查询:

SELECT * 
FROM (
  SELECT a, b, c  from T1
) AS Q 
GROUP BY c 
ORDER BY a, b;
是畸形的。为什么?因为不包括在
GROUP BY
子句中的列(在本例中为
a
b
)必须在选择列表中聚合。您的选择列表包括所有列,并且自您使用
*
以来,没有一个列被聚合

此格式错误的MySQL查询不符合SQL标准,并为非聚合列生成随机值这是您的应用程序的一个实际错误

然而,H2理所当然地拒绝它,并要求您修复它。您可以执行任何有效的选择,例如:

SELECT c, max(a) as a, max(b) as b
FROM (
  SELECT a, b, c  from T1
) AS Q 
GROUP BY c 
ORDER BY a, b;
或者可能:

SELECT * 
FROM (
  SELECT a, b, c from T1
) AS Q 
GROUP BY c, a, b 
ORDER BY a, b;

如果只需要查询H2,可以使用非标准PostgreSQL样式的
DISTINCT ON
子句,而不是分组查询:

在(C)A、B、C上按A、B从T1顺序选择不同的;

A
B
值将根据
ORDER BY
子句进行选择。

现在,对于修改后的问题。根据示例数据,在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 

这是MySQL中的不幸行为。显然,第一个问题是胡言乱语。有关进一步的帮助,请参阅:为什么你认为第一查询的结果正确?在本例中,Mysql只返回c列的任何值。to all:第一个查询给出了所需的结果。尝试了,但给出了不同的结果results@DamirOlejar“不同”的意思可能是“正确”。不,我的意思是,不需要语法是正确的,但结果不是我需要的。我需要坏语法产生的相同结果。@DamirOlejar我知道。。。这是个笑话;-)我认为您可能需要包含一些示例数据和预期结果,以帮助您根据需要重写最佳查询。此答案仅解决查询的语法错误。有趣的是,我们将尝试。您需要最新版本的H2,顺便说一句,不同的过时版本不支持它。这样的查询也可以在PostgreSQL及其分支中工作,但不能在其他DBMS中工作。问题是我有一个非常复杂的查询,从MySQL到PostgreSQL模式会太多。然而,这个解决方案就是为什么我使用这个组给出了不同的结果
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);