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