我遇到以下问题的问题:
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版本上成功执行。
有人知道为什么吗?
答案 0 :(得分:3)
这是在9.1
中引入的在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
列表表达式无法引用除聚合函数之外的未分组列,或者当未分组列为时功能上依赖于分组列,因为对于未分组的列,否则将返回多个可能的值。 如果分组列(或其子集)是包含未分组列的表的主键,则存在功能依赖。
(强调我的)