问题是:找到不参与任何项目的员工的员工姓氏。
我的解决方案是:
SELECT E.Lname
FROM EMPLOYEE E
WHERE E.Ssn NOT IN (SELECT *
FROM EMPLOYEE E,WORKS_ON W
WHERE E.Ssn = W.Essn);
这应该从WORK_on中减去雇员的ssns,但是我不断收到错误"操作数应该包含1列"。这意味着什么?如何更正此代码?
答案 0 :(得分:1)
NOT IN子查询的结果必须是一个值。您的子查询返回EMPLOYEE
和WORKS_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。
答案 1 :(得分: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。
希望它能解释你的问题
答案 2 :(得分:1)
SELECT E.Lname
FROM EMPLOYEE E
WHERE E.Ssn NOT IN (SELECT distinct Essn
FROM WORKS_ON);
答案 3 :(得分:1)
试试这个
SELECT EMPLOYEE.Lname FROM EMPLOYEE WHERE EMPLOYEE.SSN NOT IN (SELECT DISTINCT WORKS_ON.Essn FROM WORKS_ON);