Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 此处不允许使用组函数_Sql_Oracle_Sqlplus - Fatal编程技术网

Sql 此处不允许使用组函数

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

当我运行以下查询时,我得到

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
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;