我需要进行一个查询,在MySQL中的两个表之间执行关系划分。经过一些研究后,我发现下面的查询将执行关系划分(而且它运行得很好),但是无论我多么努力地尝试,我都找不出它是如何工作的或为什么工作的。
以下是两张表格:
mysql> SELECT * FROM Works_on;
+-----------+-----+-------+
| Essn | Pno | Hours |
+-----------+-----+-------+
| 123456789 | 1 | 32.5 |
| 123456789 | 2 | 7.5 |
| 333445555 | 1 | 0.0 |
| 333445555 | 2 | 10.0 |
| 333445555 | 3 | 10.0 |
| 333445555 | 10 | 10.0 |
| 333445555 | 20 | 10.0 |
| 333445555 | 30 | 0.0 |
| 453453453 | 1 | 20.0 |
| 453453453 | 2 | 20.0 |
| 666884444 | 3 | 40.0 |
+-----------+-----+-------+
mysql> SELECT * FROM Project;
+-----------------+---------+-----------+------+
| Pname | Pnumber | Plocation | Dnum |
+-----------------+---------+-----------+------+
| ProductX | 1 | Bellaire | 5 |
| ProjectY | 2 | Sugarland | 5 |
| ProjectZ | 3 | Houston | 5 |
| Computerization | 10 | Stafford | 4 |
| Reorganization | 20 | Houston | 1 |
| Newbenefits | 30 | Stafford | 4 |
+-----------------+---------+-----------+------+SQL Fiddle
problem:查找在Project表中列出的所有项目的员工的Essn。因此,基本上,Works_on除以项目的基础上的P数。
我写的查询是:
mysql> SELECT DISTINCT Essn FROM Works_on w1
WHERE NOT EXISTS
(SELECT * FROM Project p
WHERE NOT EXISTS
(SELECT * FROM Works_on w2
WHERE w2.Essn = w1.Essn AND w2.Pno = p.Pnumber));
+-----------+
| Essn |
+-----------+
| 333445555 |
+-----------+请帮助我理解这个查询是如何工作的。尤其是,最内部的问题使我感到困惑。
发布于 2014-03-27 05:41:02
你知道,我会坚持这样做的:
SELECT Essn
FROM Works_on
WHERE Pno IN (SELECT Pnumber
FROM Project)
GROUP BY
Essn
HAVING COUNT(*) = (SELECT COUNT(*)
FROM Project);我相信有一些绩效优势 (反对您的查询),也有一个清晰的逻辑结构。
SQL Fiddle
旁听建议--如果你想理解某件事的逻辑,试着自己去做。即使你不明白
https://stackoverflow.com/questions/22678698
复制相似问题