2014-12-19 72 views
2

我有以下查询一个问题:postgresql 9.3。集团由无所有列

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上,查询返回一个错误,指出group by子句中不存在column2,column3和column4。

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

有人知道为什么吗?

回答

3

这是在9.1

引用引入从the release notes

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

它也与实例in the chapter about group by:

在这个例子说明,列PRODUCT_ID,p.name,和p.price必须在GROUP BY子句,因为它们是在查询中引用选择列表(但见下文)。列s.units不必位于GROUP BY列表中,因为它仅用于表示产品销售额的汇总表达式(sum(...))中。对于每种产品,查询都将返回有关产品所有销售额的汇总行。

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

+1

正确!但我仍然认为在GROUP BY子句中列出所有非聚合的SELECT列表是很好的做法。 (当我读取一个查询时,并不总是我知道所有主键/唯一约束。) – jarlh 2014-12-19 08:56:17

1

SQL-99标准引入了函数依赖列的概念。当另一列(或一组列)已经唯一地定义它时,列在功能上依赖于另一列。所以如果你有一个带有主键的表,那么该表中的所有其他列在功能上依赖于该主键。

因此,当使用GROUP BY,并且包含表的主键时,则不需要在GROUP BY-clause中包含该表的其他列,因为它们已由主键唯一标识。

这也记录在GROUP BY Clause

GROUP BY存在,或任何聚合函数都存在,它是无效的SELECT列表中的表达式来指未分组列除了聚集函数或当内未分组的列在功能上依赖于分组列,因为否则会有多个可能的值返回未分组列。 如果分组列(或其子集)是包含未分组列的表的主键,则存在函数依赖关系。

(重点煤矿)