我想知道这个查询是如何工作的:
SELECT empname FROM Employee WHERE not exists (
SELECT projid FROM Project WHERE not exists (
SELECT empid, projid FROM Assigned WHERE empid = Employee.empid and projid = Project.projid
)
)
它应该返回分配给每个项目的所有员工的名字,但它确实有效,但是我对它如何/为什么正常工作感到困惑.
架构是:
Employee(empID INT,empName VARCHAR(100),job VARCHAR(100),deptID INT,salary INT);
Assigned(empID INT,projID INT,role VARCHAR(100));
Project(projID INT,title VARCHAR(100),budget INT,funds INT);
我是SQL的新手,所以详细/简单的解释将不胜感激.
解决方法:
当我需要尝试了解正在发生的事情时,我会寻找最内在的查询并向外工作.在你的情况下,让我们从:
SELECT empid, projid
FROM Assigned
WHERE empid = Employee.empid and projid = Project.projid
这匹配了Assigned表中empid和projid在前面的表中的所有记录(因此是Employee.empid和Project.projid).
假设Projects表中有5个项目,并且每个项目都分配了Employee1.这将返回5条记录.还假设Employee2被分配给其中一个项目,从而返回1个记录.
接下来看看:
SELECT projid FROM Project WHERE not exists (
...
)
现在,对于上一个查询中的那些已找到的记录(Employee1有5个项目,Employee2有1个项目),请从Project表中选择任何与上一个查询没有任何匹配(不存在)的projid.换句话说,Employee1将不从此查询返回任何项目,但Employee2将返回4个项目.
最后,看看
SELECT empname FROM Employee WHERE not exists (
...
)
与第二个查询一样,对于在上一个查询中找到的任何记录(没有记录将这些员工与所有项目(如Employee1)匹配,如果员工没有分配给每个项目,如Employee2,则选择一些记录),从中选择任何员工没有任何匹配的Employee表(同样,不存在).换句话说,Employee1将返回,因为没有项目从上一个查询返回,并且Employee2将不返回,因为从上一个查询返回了一个或多个项目.
希望这可以帮助.以下是有关EXISTS的一些其他信息:
从那篇文章:
What kind of store is present in all cities?
SELECT DISTINCT store_type FROM stores s1 WHERE NOT EXISTS (
SELECT * FROM cities WHERE NOT EXISTS (
SELECT * FROM cities_stores
WHERE cities_stores.city = cities.city AND cities_stores.store_type = stores.store_type));
The last example is a double-nested NOT EXISTS query. That is, it has
a NOT EXISTS clause within a NOT EXISTS clause. Formally, it answers
the question “does a city exist with a store that is not in Stores”?
But it is easier to say that a nested NOT EXISTS answers the question
“is x TRUE for all y?”
祝好运.
标签:mysql,database
来源: https://codeday.me/bug/20190620/1245660.html