PostgreSQL的9.3。没有所有列的分组依据

use*_*376 5 sql postgresql group-by

我对以下查询有疑问:

SELECT 
        ee.id 
        ee.column2
        ee.column3,
        ee.column4, 
        SUM(ee.column5)
      FROM 
         table1 ee 
         LEFT JOIN table2 epc ON ee.id = epc.id
      WHERE 
         ee.id (6050) 
      GROUP BY ee.id
Run Code Online (Sandbox Code Playgroud)

WHERE列ID是主键。在版本8.4上,查询返回错误,指出group by子句中不存在column2,column3和column4。

此查询在9.3版上成功执行。

有人知道为什么吗?

小智 5

这是9.1中引入的

引用发行说明

当在 GROUP BY 子句中指定主键时,允许查询目标列表中出现非 GROUP BY 列 (Peter Eisentraut)
SQL 标准允许这种行为,并且由于有主键,结果是明确的。

本章还通过示例进行了解释group by

在此示例中,列product_id、p.name 和p.price 必须位于GROUP BY 子句中,因为它们在查询选择列表中被引用(但请参见下文)。列 s.units 不必位于 GROUP BY 列表中,因为它仅在聚合表达式 (sum(...)) 中使用,该表达式表示产品的销售额。对于每个产品,查询返回有关该产品所有销售的汇总行。

简而言之:如果group by子句包含唯一标识行的列,则仅包含该列就足够了。