Sql 此处不允许使用组函数
当我运行以下查询时,我得到 ORA-00934:此处不允许使用组功能 有什么问题Sql 此处不允许使用组函数,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,当我运行以下查询时,我得到 ORA-00934:此处不允许使用组功能 有什么问题 select c.Numcom,c.Nompr,c.salaire_fix from commercialv c,comercialv c1 where c.salaire_fix=(max(c1.salaire_fix) ); 不能在WHERE子句中使用聚合函数 根据您的用例,您可能需要一个子查询: select c.Numcom,c.Nompr,c.salaire_fix from commercialv c
select c.Numcom,c.Nompr,c.salaire_fix
from commercialv c,comercialv c1
where c.salaire_fix=(max(c1.salaire_fix) );
不能在
WHERE
子句中使用聚合函数
根据您的用例,您可能需要一个子查询:
select c.Numcom,c.Nompr,c.salaire_fix
from commercialv c
where c.salaire_fix=(select max(salaire_fix) from comercialv);
理性的观点是聚合函数在一个集合上工作。另一方面,
WHERE
子句只能访问一行的数据 您可以使用分析函数执行任何操作:
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
子句中不允许使用聚合函数。您也可以使用MAX()
作为窗口函数(或分析函数,如果您喜欢Oracle术语):
您还可以使用RANK()
:
甚至ROWNUM
:
SELECT * FROM (
SELECT numcom, nompr, salaire_fix
FROM commercialv
ORDER BY salaire_fix DESC
) WHERE rownum = 1;
最后一个的唯一困难是,即使有最大值为
salaire\u fix
的额外行,它也只能得到一行。在这种情况下,前两个查询将得到不止一行。首先我认为您错过了一个连接,其次您应该作为子查询得到最大值。这太糟糕了。c.salarie\u fix=max(c.salaire\u fix)over()
不起作用。此选项通常性能更好(它避免了表上的第二次探测)。为什么(其中c.salarie\u fix=max(c.salaire\u fix))不起作用或(c.salarie_fix=max(c.salarie_fix))起作用???第一个不起作用,因为聚合函数(和窗口函数)在WHERE
子句中不起作用。第二种方法不起作用,因为按salaire\u-fix
分组时无法获得MAX(salaire\u-fix)
。实际上,实现您想要的结果的最佳方法是使用分析(窗口)函数,如我的答案和@Gordon Linoff的@Sylvain Leroux的也可以工作,并且具有完全可移植的优势(例如,到MySQL,它没有窗口功能)。为什么(c.salarie_fix=max(c.salaire_fix))不工作或者(c.salarie_fix=max(c.salaire_fix))工作???在一组上工作<代码>其中
用于过滤单个(“输入”)行。
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;
SELECT * FROM (
SELECT numcom, nompr, salaire_fix
FROM commercialv
ORDER BY salaire_fix DESC
) WHERE rownum = 1;