我有这样的查询:
Select
a.abc,
a.cde,
a.efg,
a.agh,
c.dummy
p.test
max(b.this)
sum(b.sugar)
sum(b.bucket)
sum(b.something)
后跟一些外连接和内连接。现在的问题是在分组时
group by
a.abc,
a.cde,
a.efg,
a.agh,
c.dummy,
p.test
查询工作正常。但如果我从组中删除其中任何一个,它会给出:
SQLSTATE: 42803
有人能解释这个错误的原因吗?
答案 0 :(得分:12)
通常,group by
部分中的任何列只有在应用了聚合函数的情况下才能包含在select
部分中。或者,另一种方式,select
部分中的任何非聚合数据都必须分组。
Otherewise,如何你知道你想做什么。例如,如果您对a.abc
进行分组,那么a.abc
只能为该分组行提供一件事(因为a.abc
的所有其他值都会出现在中不同的行)。这是一个简短的例子,其中包含一个表:
LastName FirstName Salary
-------- --------- ------
Smith John 123456
Smith George 111111
Diablo Pax 999999
使用查询select LastName, Salary from Employees group by LastName
,您可能会看到:
LastName Salary
-------- ------
Smith ??????
Diablo 999999
Smiths的工资是不可估量的,因为你不知道应用什么函数,这就是导致错误的原因。换句话说,DBMS不知道如何处理123456
和111111
以获取分组行的单个值。
如果您改为使用select LastName, sum(Salary) from Employees group by LastName
(或max()
或min()
或ave()
或任何其他聚合函数),则DBMS将知道该怎么做。对于sum()
,它只会添加它们并为您提供234567
。
在您的查询中,相当于在没有汇总功能的情况下尝试使用Salary
,只需将sum(b.this)
更改为b.this
,但不要将其包含在group by
部分中。或者,删除其中一个group by
列,而不将其更改为select
部分中的聚合。
在这两种情况下,您都会有一行具有多个列的可能值。
sqlstate 42803的DB2 docs at publib描述了您的问题:
SELECT或HAVING子句中的列引用无效,因为它不是分组列;或者GROUP BY子句中的列引用无效。
答案 1 :(得分:2)
SQL将坚持SELECT部分中的任何列都包含在GROUP BY部分中,或者在SELECT部分中应用了聚合函数。
This article给出了一个很好的解释,为什么会这样。这篇文章是特定于sql server的,但原则应该与所有RDBMS
大致相似