报错信息:
ERROR: column "xxxx" must appearin the GROUP BY clause or be used in an aggregate function
问题描述:
KES数据库group by 操作与mysql 结果不同。
分析与解决方法:
MySQL 的group by : MySQL支持select list中非聚集列可以不出现在group by中。sql标准是必须出现在group by中, 如:select col1, col2 from tab group by col1;
kingbase为兼容mysql,设置了个sql_mode参数,其默认包含ONLY_FULL_GROUP_BY选项。 如果sql_mode中不包含ONLY_FULL_GROUP_BY,group by语句可以不符合sql标准,也就是与mysql结果相同。
test=# create table t1(id1 integer, id2 integer, val integer);
CREATE TABLE
test=# show sql_mode;
sql_mode
--------------------------------
ONLY_FULL_GROUP_BY,ANSI_QUOTES
(1 row)
test=# select id1, id2, count(*) from t1 group by id1;
ERROR: column "t1.id2" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select id1, id2, count(*) from t1 group by id1;
^
test=# set sql_mode = '';
SET
test=# select id1, id2, count(*) from t1 group by id1;
id1 | id2 | count
-----+-----+-------
(0 rows)
使用双引号做界定符
问题描述:
MySQL数据库模式使用双引号做界定符报语法错误。
分析与解决方法:
需要设置GUC参数sql_mode,使其包括ANSI_QUOTES,就可以兼容双引号。例如:
set sql_mode = ANSI_QUOTES;
不设置ANSI_QUOTES时,mysql可以使用双引号来引用字符串常量。而设置ANSI_QUOTES后, 双引号内的内容不再是字符串,而是mysql的标识符(如表名、字段名)。 这是mysql 值的 说明,定制版支持这个参数值就需要按规则使用 (V008R006C008B0020版本及以后支持 ANSI_QUOTES )