我有以下查询 -
select ssn, fname, lname
from employee, department
where (dname, dno) in (select dname, dno
from department, employee
where dno=dnumber
and dname <> 'Headquarters'
and dname <> 'Administration');
`
它会返回不在总部或行政部门工作的ssn
,fname
和lname
员工。
我无法扭转逻辑并弄清楚如何使用&#34;而不是&#34;来获得相同的结果。从我收集到的&#34; in&#34;谓词遍历表并检查它是否可以创建fname
,lname
和ssn
的元组,这些元组基于员工表中与部门中的部门编号匹配的部门编号表。
答案 0 :(得分:1)
您必须使用de Morgan's Law
在子查询的WHERE
子句中反转测试
select ssn, fname, lname
from employee, department
where (dname, dno) not in (
select dname, dno
from department, employee
where dno != dnumber or dname IN ('Headquarters', 'Administration'));
答案 1 :(得分:0)
我发现锯齿可以帮助我跟踪事情:
SELECT emp.ssn, emp.fname, emp.lname
FROM employee emp, department dep1
WHERE emp.dnumber = dep1.dno /* link the tables here */
AND (dep1.dno NOT IN ( /* subquery filters eligible results */
SELECT dep2.dno
FROM department dep2
WHERE dep2.dname <> 'Headquarters'
AND dep2.dname <> 'Administration')
);
注意:我没有测试过这个,但它应该很接近。