postgresql 9.3。没有所有列分组

时间:2014-12-19 08:03:18

标签: 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

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

同样的查询在9.3版本上成功执行。

有人知道为什么吗?

2 个答案:

答案 0 :(得分:3)

这是在9.1

中引入的

引自the release notes

  

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

还通过示例in the chapter about group by:

进行了解释
  

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

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

答案 1 :(得分:2)

SQL-99标准引入了功能相关列的概念。当另一列(或列集)已经唯一地定义列时,列在功能上依赖于另一列。因此,如果您有一个包含主键的表,那么该表中的所有其他列在功能上都依赖于该主键。

因此,当使用GROUP BY并且包含表的主键时,您不需要在GROUP BY - 子句中包含同一个表的其他列,因为它们已经存在由主键唯一标识。

GROUP BY Clause中也记录了这一点:

  

当存在GROUP BY或存在任何聚合函数时,SELECT列表表达式无法引用除聚合函数之外的未分组列,或者当未分组列为功能上依赖于分组列,因为对于未分组的列,否则将返回多个可能的值。 如果分组列(或其子集)是包含未分组列的表的主键,则存在功能依赖。

(强调我的)