我有这样的查询:
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)
Run Code Online (Sandbox Code Playgroud)
接着是一些外连接和内连接.现在的问题是在分组时
group by
a.abc,
a.cde,
a.efg,
a.agh,
c.dummy,
p.test
Run Code Online (Sandbox Code Playgroud)
查询工作正常.但如果我从组中删除其中任何一个,它会给出:
SQLSTATE: 42803
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个错误的原因吗?
pax*_*blo 12
通常,任何不在该group by部分中的列只有在select应用了聚合函数的情况下才能包含在该部分中.或者,另一种方式,select必须对该部分中的任何非聚合数据进行分组.
在这方面,你怎么知道你想用它做什么.例如,如果您分组a.abc,则a.abc该分组行只能有一件事(因为所有其他值a.abc将出现在不同的行中).这是一个简短的例子,其中包含一个表:
LastName FirstName Salary
-------- --------- ------
Smith John 123456
Smith George 111111
Diablo Pax 999999
Run Code Online (Sandbox Code Playgroud)
通过查询select LastName, Salary from Employees group by LastName,您可以看到:
LastName Salary
-------- ------
Smith ??????
Diablo 999999
Run Code Online (Sandbox Code Playgroud)
史密斯的工资是不可估量的,因为你不知道应用什么函数,这就是导致错误的原因.换句话说,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部分中的聚合.
在这两种情况下,您将拥有一行具有列的多个可能值.
publib for sqlstate 42803 的DB2文档描述了您的问题:
SELECT或HAVING子句中的列引用无效,因为它不是分组列; 或者GROUP BY子句中的列引用无效.
| 归档时间: |
|
| 查看次数: |
9104 次 |
| 最近记录: |