如何将IN谓词写为NOT IN谓词

时间:2015-09-03 21:11:52

标签: mysql sql oracle

我有以下查询 -

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');

`

它会返回不在总部或行政部门工作的ssnfnamelname员工。

我无法扭转逻辑并弄清楚如何使用&#34;而不是&#34;来获得相同的结果。从我收集到的&#34; in&#34;谓词遍历表并检查它是否可以创建fnamelnamessn的元组,这些元组基于员工表中与部门中的部门编号匹配的部门编号表。

2 个答案:

答案 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') 
);

注意:我没有测试过这个,但它应该很接近。