2014-02-12 47 views
0

我想要至少在所有empno 101工作的相同项目上工作的empno。Oracle SQL中的所有关键字

我尝试下面的查询,但失败:

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

EMPNO 101正在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 
+0

Oracle和MySQL或只是其中的1? – DanFromGermany

+0

oracel sqlplus。 – ashwinbhy

+0

你希望得到什么结果? –

回答

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

+0

在将给我多个值,我不想要的。 如果任何员工在任何一个项目中工作,将显示emp 101正在处理两个项目。 我想要在emp101的所有项目中工作的员工。 – ashwinbhy

+0

@ashwinbhy尝试我编辑的答案。 –

1

对于精确匹配简单:

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