H2 DB - 列必须在"分组依据"列表中

met*_*e38 4 java sql database h2

我正在使用H2-DB访问静态数据库......

我有一张桌子,看起来像:

COUNTRY     STATE       CITY         LAT     LNG     COUNTRYID      STATEID     CITYID 
"Germany"   "Berlin"    ""           1.23    1.23    1              1           0
"Germany"   "München"   ""           1.23    1.23    1              2           0
"USA"       "Alabama"   "Auburn"     1.23    1.23    2              1           1
"USA"       "Alabama"   "Birmingham" 1.23    1.23    2              1           2
"USA"       "Alaska"    "Anchorage"  1.23    1.23    2              2           1
"USA"       "Alaska"    "Cordova"    1.23    1.23    2              2           2
Run Code Online (Sandbox Code Playgroud)

它是一个包含许多国家的巨大名单,其中大多数只有国家和州(如德国,而国家是城市),少数也有城市(如美国这里)......

问题是现在,当我查询

SELECT * FROM MyTable WHERE COUNTRY = 'Germany' group by STATE order by STATE
Run Code Online (Sandbox Code Playgroud)

为了获得状态(或城市)的排序列表,我得到一个错误说

Field CITY must be in the GROUP BY list
Run Code Online (Sandbox Code Playgroud)

如果行有一个城市,我需要整行,否则我只需要State列,但我可以知道查询后,它是否使用城市列,所以我必须查询"*"而不是"国家"

查询应该没问题,还是?在MySql上它正常工作......所以这里的问题是什么?

如果有帮助,找到它:http://www.h2database.com/javadoc/org/h2/constant/ErrorCode.html#c90016

倚天

Gor*_*off 6

关于这个问题,MySQL已经破产了.它允许列中的列GROUP BY既不是group by聚合函数也不是聚合函数的参数.实际上,文档警告不要使用此扩展.

所以你可以这样做:

SELECT state
FROM DIYANET
WHERE COUNTRY = 'Germany'
GROUP BY STATE 
ORDER BY STATE;
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

SELECT state, min(city), min(lat), . . .
FROM DIYANET
WHERE COUNTRY = 'Germany'
GROUP BY STATE 
ORDER BY STATE;
Run Code Online (Sandbox Code Playgroud)

但是SELECT *不允许,也没有意义.