2016-03-06 82 views
0

我想在oracle中回答以下問題:SQL中的值太多錯誤

列出不在任何項目上工作的員工的姓名。

使用下面的代碼:

select e.ename, count(w.pno) from employee e, works_on w where e.ssn=w.essn group by e.ename having count(w.pno) not in (select e.ename, count(w.pno) from works_on w, employee e where e.ssn=w.essn having count(w.pno)<>0);

,但我在6號線正在錯誤 ERROR: ORA-00913:值過多

回答

1

這就是爲什麼你應該很好的例子使用明確的joins。爲了這樣做,你需要一個outer join

select e.ename 
from employee e 
    left join works_on w on e.ssn=w.essn 
where w.essn is null 

一般情況下,最好不要到from子句中使用逗號。


這裏是你將如何與not exists做到這一點:

select name 
from employee e 
where not exists (
    select 1 
    from works_on w 
    where e.ssn = w.essn 
) 
1

您的查詢拋出ORA-00913: too many values因爲由NOT IN條款中引用的子查詢只返回一個值,但要返回e.enamecount(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 
);