此处不允许使用群组功能

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 时,此处不允许使用组功能

Java 8 javadoc doclint 功能“此处不允许标记”

为啥这个窗口功能不起作用?我无法使用群组

此处不允许使用相对虚拟路径 ''

此处不允许使用“set”指令

此处不允许使用 Maven Jetty 插件守护程序元素