缺少右括号的oracle命令

时间:2017-02-05 05:43:55

标签: sql oracle

我需要找到最大数量的不同员工 所以我的代码就像:

select ProjName from Project where ProjId in (
select ProjId from EmpProject 
order by count(ProjId) desc
group by ProjId
where rownum<=1
);

但它抛出一个错误,说缺少右括号。 那么有人能告诉我如何解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

你的语法不正确。 order by子句在结尾处,wheregroup by之前。所以你的查询变为:

SELECT ProjName
FROM Project
WHERE ProjId IN
  (SELECT ProjId
  FROM EmpProject
  WHERE rownum<=1
  GROUP BY ProjId
  ORDER BY COUNT(ProjId) DESC
  );

上面的内容可能不是你想要的,假设你想获得最大数量的顶级项目。

在11g或之前,您可以在子查询中使用排序,然后在外面应用rownum过滤器:

SELECT ProjName
FROM Project
WHERE ProjId IN
  (SELECT ProjId
  FROM
    (SELECT ProjId FROM EmpProject GROUP BY ProjId ORDER BY COUNT(ProjId) DESC
    )
  WHERE rownum<=1
  );

在12c及以上,您可以像这样使用FETCH FIRST

SELECT ProjName
FROM Project
WHERE ProjId IN
  (SELECT ProjId FROM EmpProject GROUP BY ProjId ORDER BY COUNT(ProjId) DESC
  FETCH FIRST 1 row only
  );

答案 1 :(得分:1)

如果要查找分配给最多员工数量的项目,您还可以使用窗口功能和聚合的组合。自从Oracle 10(甚至可能是Oracle 9)以来,这将适用于任何事情

select p.projname
from project p
  join (
    select projid, 
           row_number() over (order by count(*) desc) as rn
    from empproject
    group by projid
  ) t on t.projid = p.projid and t.rn = 1

答案 2 :(得分:0)

您的要求只是说“最大数量的不同员工” - 它没有说明如何以最大员工数返回项目的projectID。这意味着查询应该只返回一个数字,没有别的。

假设您的EmpProject显示为哪个员工分配到哪个项目的empID和projID,并且还假设可能存在重复项(不清楚为什么会有,但是您要求DISTINCT员工好像可能存在重复项) - 您可以做这样的事情。使用SCOTT模式中的标准EMP表进行说明,因为您没有提供测试数据;用EmpProject和empID以及projID替换表名和列名,以便在表上使用它。

select   max( count(distinct empno) ) as max_employees
from     emp
group by deptno
;

MAX_EMPLOYEES
-------------
6