您的查詢拋出ORA-00913: too many values
因爲由NOT IN
條款中引用的子查詢只返回一個值,但要返回e.ename
和count(w.pno)
。如果你刪除e.ename,
那麼它將執行。
然而,它仍然不是你想perfom從具有行至WORKS_ON
表,你正在努力尋找其在該表中沒有條目員工EMPLOYEE
表的INNER JOIN
返回任何結果和INNER JOIN
會根本不會返回任何行,因爲WORKS_ON
中沒有任何內容可以加入。
如果你改變你的查詢到LEFT OUTER JOIN
那麼它會工作:
select e.ename, count(w.pno)
from employee e
LEFT OUTER JOIN works_on w
ON e.ssn=w.essn
group by e.ename
having count(w.pno) not in
(select count(w.pno)
from works_on w, employee e
where e.ssn=w.essn
having count(w.pno)<>0);
但是,這將是低效的,並且可以更簡單地表述爲:
SELECT e.ename,
count(w.pno)
FROM employee e
LEFT OUTER JOIN works_on w
ON e.ssn=w.essn
GROUP BY e.ename
HAVING count(w.pno) = 0;
(但你碰上你將分組在員工姓名上的問題,如果兩個人具有相同的姓名,則他們將被錯誤地分組在一起。)
它可以是前按下更簡單,並且沒有分組問題,使用NOT EXISTS
:
SELECT e.ename
FROM Employees e
WHERE NOT EXISTS (
SELECT 1
FROM Works_on w
WHERE e.ssn = w.essn
);
來源
2016-03-06 01:00:15
MT0