我的问题:为什么这句语句能得到想要的结果?EXCEPT和关联子查询在这句语句中是怎么发挥效果的?
还有没有别种写法?
第一个表名Skills
内容是
skill
--------
Oracle
UNIX
Java
第二个表名EmpSkills
内容是
emp | skill
--------+--------
一号 | Oracle
一号 | UNIX
一号 | Java
一号 | C#
二号 | Oracle
二号 | UNIX
二号 | Java
三号 | UNIX
三号 | Oracle
三号 | PHP
三号 | Perl
三号 | C++
四号 | Perl
五号 | Oracle
要求是找出掌握Skill三个领域的员工,
结果是得到一号、二号。
语句是:
SELECT DISTINCT emp
FROM EmpSkills ES1
WHERE NOT EXISTS
(SELECT skill
FROM Skills
EXCEPT
SELECT skill
FROM EmpSkills ES2
WHERE ES1.emp = ES2.emp);
结果是:
emp
------
一号
二号
这段语句体现的是关系除法,
Skills中的skill是除数,
EmpSkills中的skill是被除数。
对于一号来说:
得到的是空集合。
对于三号来说:
还有Java。
从而用NOT EXISTS达到想要的结果。
参考:SQL关系除法的思考