2016-03-01 96 views
0

enter image description hereMySQL:正確使用「NOT IN」子句

問題是:爲不適用於任何項目的員工查找員工姓氏。

我的解決辦法是:

SELECT E.Lname 
FROM EMPLOYEE E 
WHERE E.Ssn NOT IN (SELECT * 
        FROM EMPLOYEE E,WORKS_ON W 
        WHERE E.Ssn = W.Essn); 

這應該從works_on的essns員工減去核潛艇,不過,我不斷收到錯誤「操作數應包含1列」。這是什麼意思,我該如何糾正這段代碼?

回答

1

試試這個

SELECT EMPLOYEE.Lname FROM EMPLOYEE WHERE EMPLOYEE.SSN NOT IN (SELECT DISTINCT WORKS_ON.Essn FROM WORKS_ON); 
+0

您沒有將表僱員連接到任何地方的表。這沒有必要嗎? –

+1

因爲您的問題只能找到不適用於任何項目的員工的員工姓氏。 –

1

NOT IN子查詢的結果必須是一個值。您的子查詢將返回EMPLOYEEWORKS_ON表中的所有列。您可以使用NOT EXISTS來代替:

SELECT E.Lname 
FROM EMPLOYEE E 
WHERE NOT EXISTS (SELECT 1 
        FROM WORKS_ON W 
        WHERE E.Ssn = W.Essn); 

1可以是任何標量,或者它甚至可以是NULL。

+0

是什麼NOT IN的區別和NOT EXISTS又是什麼1這裏的意思? –

+1

看看這個問題和答案:http://stackoverflow.com/questions/173041/not-in-vs-not-exists – bernie

+1

@DanteGreyson *不存在*執行比* IN *更好。 – RubahMalam

1
SELECT E.Lname 
FROM EMPLOYEE E 
WHERE E.Ssn NOT IN (SELECT E.Ssn 
        FROM EMPLOYEE E,WORKS_ON W 
        WHERE E.Ssn = W.Essn); 

不在,表示不包含另一個值集。 因此,在下一個查詢中,它應該選擇值集。

SELECT E.Ssn 
FROM EMPLOYEE E,WORKS_ON W 
WHERE E.Ssn = W.Essn 

這部分將返回已經工作過的所有員工的SSN。

希望這說明您的問題

1
SELECT E.Lname 
FROM EMPLOYEE E 
WHERE E.Ssn NOT IN (SELECT distinct Essn 
        FROM WORKS_ON);