此处不允许使用群组功能
Posted
技术标签:
【中文标题】此处不允许使用群组功能【英文标题】:Group function is not allowed here 【发布时间】:2015-01-21 21:53:19 【问题描述】:当我运行以下查询时,我得到了
ORA-00934:
有什么问题?
select c.Numcom,c.Nompr,c.salaire_fix
from commercialv c,comercialv c1
where c.salaire_fix=(max(c1.salaire_fix) );
【问题讨论】:
首先我认为你错过了一个连接,其次你应该将最大值作为子查询 【参考方案1】:您不能在WHERE
子句中使用聚合函数。
鉴于您的用例,您可能需要一个子查询:
select c.Numcom,c.Nompr,c.salaire_fix
from commercialv c
where c.salaire_fix=(select max(salaire_fix) from comercialv);
理由是聚合函数适用于集合。另一方面,WHERE
子句只能访问一行 的数据。
【讨论】:
为什么(其中 c.salarie_fix = max(c.salaire_fix) )不起作用或(具有 c.salarie_fix = max(c.salaire_fix))起作用???having
在一个组中工作。 where
用于过滤单个(“输入”)行。【参考方案2】:
你可以用分析函数做你想做的事:
select Numcom, Nompr, salair_fix
from (select c.Numcom, c.Nompr, c.salaire_fix,
max(c.salaire_fix) over () as maxs
from commercialv c
) c
where c.salaire_fix = c.maxs;
对于您的查询,where
子句中不允许使用聚合函数。
【讨论】:
太糟糕了c.salarie_fix = max(c.salaire_fix) over ()
不起作用
这个选项通常会表现得更好(它避免了在桌子上的第二次探测)。【参考方案3】:
您也可以使用 MAX()
作为窗口函数(或者如果您更喜欢 Oracle 术语,则使用分析函数)来执行此查询:
SELECT numcom, nompr, salaire_fix FROM (
SELECT numcom, nompr, salaire_fix, MAX(salaire_fix) OVER ( ) AS max_salaire_fix
FROM commercialv
) WHERE salaire_fix = max_salaire_fix;
你也可以使用RANK()
:
SELECT numcom, nompr, salaire_fix FROM (
SELECT numcom, nompr, salaire_fix, RANK() OVER ( ORDER BY salaire_fix DESC ) AS salaire_fix_rank
FROM commercialv
) WHERE salaire_fix_rank = 1;
甚至ROWNUM
:
SELECT * FROM (
SELECT numcom, nompr, salaire_fix
FROM commercialv
ORDER BY salaire_fix DESC
) WHERE rownum = 1;
最后一个的唯一困难是即使有最大值为salaire_fix
的额外行,它也只会得到一行。在这种情况下,前两个查询将获得不止一行。
【讨论】:
为什么(其中 c.salarie_fix = max(c.salaire_fix) )不起作用或(具有 c.salarie_fix = max(c.salaire_fix))起作用 ??? 第一个不起作用,因为聚合函数(和窗口函数)在WHERE
子句中不起作用。第二个不起作用,因为您在按salaire_fix
分组时无法获得MAX(salaire_fix)
。确实,实现您想要的结果的最佳方法是使用我的答案和@Gordon Linoff 中的分析(窗口)函数。 @Sylvain Leroux 也可以工作,并且具有完全可移植的优点(例如,对于没有窗口函数的 mysql)。以上是关于此处不允许使用群组功能的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00934: 尝试使用 UPDATE 时,此处不允许使用组功能