Oracle SQL中的ALL关键字

时间:2014-02-12 17:40:34

标签: sql oracle

我想要至少在empno 101工作的所有相同项目上工作的empno。

我尝试了以下查询但失败了:

SELECT EMPNO
FROM EMPLOYEE
WHERE PROJECTNO= ALL(SELECT PROJECTNO
                  FROM EMPLOYEE
                  WHERE EMPNO=101);

Empno 101 IS正在研究comp134和comp90 而且empno 103也在开展这两个项目 但我得到的答案为no rows selected以供下表。

projectno empno
--------- ------
comp134      101
comp90       101
comp90       103    
comp14       104
comp213      103
comp134      103
comp14       108
comp90       104

3 个答案:

答案 0 :(得分:1)

Exact 匹配:

SELECT EMPNO 
FROM EMPLOYEE E1
WHERE EXISTS
(
 SELECT 'x' FROM EMPLOYEE E2
   WHERE E2.EMPNO=101 AND E1.PROJECTNO = E2.PROJECTNO
)
MINUS
SELECT EMPNO
FROM EMPLOYEE E1
WHERE NOT EXISTS
(SELECT 'x' FROM EMPLOYEE E2
 WHERE E2.EMPNO=101 AND E1.PROJECTNO = E2.PROJECTNO)

对于Atleast 所有它也适用于完全匹配

SELECT EMPNO
FROM EMPLOYEE  e
JOIN (SELECT PROJECTNO,count(1) OVER () AS ct
      FROM EMPLOYEE
      WHERE EMPNO=101) my_list
ON (e.PROJECTNO = my_list.PROJECTNO AND e.EMPNO <> 101)
GROUP BY EMPNO
HAVING count(*) = MAX(my_list.ct)

答案 1 :(得分:0)

试试这个

 select `projectno` from 
                    ( select `projectno`, count(`empno`) as counts from EMPLOYEE 
                     group by `empno`
                     order by counts desc
                     limit 1)t  ;

甚至更简单

 select `projectno` 
 from EMPLOYEE 
 group by `empno`
 order by count(`empno`) desc
 limit 1

DEMO HERE

答案 2 :(得分:0)

这听起来像是一种关系部门:

with cte as
 ( select PROJECTNO
   from EMPLOYEE 
   WHERE EMPNO=101
 )
SELECT EMPNO
FROM EMPLOYEE as e
join cte
on e.PROJECTNO = cte.PROJECTNO
group by EMPNO
HAVING count(*) 
    = (select count(*) from cte)