假设我有此表:named = the_table, 其结构为:
PostgreSQL的:
create table the_table (col3 SERIAL, col2 varchar, col1 varchar, PRIMARY KEY(col3));
MySQL:
create table the_table ( col3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, col2 varchar(20), col1 varchar(20) )
然后我插入了表格:
INSERT INTO the_table (col2,col1) VALUES
('x','a'),
('x','b'),
('y','c'),
('y','d'),
('z','e'),
('z','f');
现在该表如下所示:
col3 | col2 | col1
------+------+------
1 | x | a
2 | x | b
3 | y | c
4 | y | d
5 | z | e
6 | z | f
当我执行此查询时:
select * from the_table group by col2
然后在mysql中,我得到:
1 x a
3 y c
5 z e
在PostgreSQL中,我得到了错误:
ERROR: column "the_table.col3" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: select * from the_table group by col2;
我的问题:
这个错误是什么意思?什么是集合函数?
当它在MySQL中工作时,为什么不能在postgreSQL中工作?
您需要使用AGGREGATE
FUNCTION
:
聚合函数根据一组输入值计算单个结果。
SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table
GROUP BY col2;
db <>
fiddle演示
MySQL对GROUP BY的处理 :
在标准SQL中,包含GROUP BY子句的查询不能引用选择列表中未在GROUP BY子句中命名的未聚合列
和:
MySQL扩展了GROUP BY的使用,以便选择列表可以引用未在GROUP
BY子句中命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以使用此功能来避免不必要的列排序和分组,从而获得更好的性能。但是,这主要在每个未聚合列中未在GROUP
BY中命名的所有值对于每个组都相同时才有用。 服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的
因此,对于没有显式聚合函数的MySQL版本,您可能会得到不确定的值。我强烈建议使用特定的聚合函数。
编辑:
从MySQL处理GROUP BY:
SQL92和更早版本不允许查询,其中选择列表,HAVING条件或ORDER BY列表引用未在GROUP BY子句中命名的非聚合列。
如果SQL99和更高版本 在功能上依赖于GROUP BY列 ,则按可选功能T301允许此类非聚合 :
如果name和custid之间存在这种关系,则查询合法。举例来说,如果客户是客户的主键,那就是这种情况。
例:
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o
JOIN customers AS c
ON o.custid = c.custid
GROUP BY o.custid;
问题内容: 我正在尝试使用该子句从表中检索数据。我想从中获取除存在的行以外的所有行。据我了解,以下内容不起作用: 我可以使用的唯一方法似乎是从相同的表中选择,或者从不同的表中选择具有相同列名的列。 有人可以解释一下如何最好地使用解释子句吗? 问题答案: 您的查询似乎完全有效: 列 名 与查询无关。只有 数据类型 必须匹配。您的查询的输出列名称为,仅因为它是first中的列名称。您可以使用任何别名。
问题内容: 我有这样的查询: 出现以下错误: 在MySql中,这是有效的,但显然在Postgresql中是无效的。据我所知,原因是查询部分的评估晚于该部分。是否有解决此问题的常用解决方法? 问题答案: 正如您所经历的那样,MySQL的支持是非标准的。正确的方法是重新打印SELECT子句中使用的相同表达式:
问题内容: PostgreSQL文档中将ORDER BY子句描述为: 有人可以给我一些使用方法的例子吗?是否有可能获得结果集的交替顺序? 问题答案: 一个非常简单的示例是: 但这很无聊,因为这是传统方式无法做到的。 同样,标准目录中没有提及任何奇怪的比较功能/运算符。您可以获得它们的列表: 您会注意到,主要有和函数用于基本类型,例如,等等,还有更多函数用于数组和向量等等。这些操作员都无法帮助您获得
需要您的帮助,我不明白为什么会出现以下错误,我不是专业的postgresql开发人员。。 正如你可以看到创建的函数,那么为什么函数不存在? 错误:函数logintry(未知,未知,带时区的时间戳,整数)不存在第1行:选择logintry('Jon.Jones88@gmail.com','_@kjhfdb987',...^HINT:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。SQL
问题内容: 我在SO上找到了一些主题,但是仍然找不到适合我的查询的设置。 这是查询,在本地主机上运行得很好: 但是在Heroku上,我 遇到了-GROUP BY子句 上面的错误, 或者在聚合函数中使用 。 然后,我在某处读到,我应该指定表中的所有列,因此我尝试了以下操作: 但这在本地主机上不起作用,在Heroku上也不行… 什么是查询的正确配置? 问题答案: 我认为您正在尝试在同一列上进行汇总和分
我在PostgreSQL中有一个存储过程,我想在表中进行插入。我从这个过程中得到了一些参数,并使用它们尝试在其他表上选择其他属性。 这是我的存储过程: 当我试图执行时,它抛出一个错误,说:“错误:列“customer_code”不存在”,“提示:表“sales_invoice_header”中有一个名为“customer_code”的列,但不能从查询的这一部分引用它。” 表客户是存在的,有一个名为