我是SQL的初学者。我现在正在学习EXISTS而不是EXESTS。
问题:
检索处理所有项目的每个员工的姓名 由部门5控制。
答案:
select fname, lname
from employee
where not exists ( (select pnumber from project where dnum = 5)
MINUS
(select pno from works_on where essn = ssn)
);
子查询中的第一个选择为(1,2,3)
,第二个选择为(1,2,3,10,20,30)
。所以(1,2,3) - (1,2,3,10,20,30) = 0
。这是如何解决查询的?我不确定我的逻辑是否正确或我解决问题的方式。
有人可以帮我逐步理解解决方案吗?感谢
答案 0 :(得分:1)
所以,最初的问题是:
检索处理由部门5控制的所有项目的每个员工的姓名。
提供的答案使用了等价:
用英语表示,问题相当于找到那些没有由部门5控制的项目的员工,而该员工没有工作。
因此,首先找到由部门5控制的所有项目,然后从该员工处理的任何项目中删除。这正是提供的答案所做的。如果没有任何东西,那么部门5没有控制该员工不工作的项目。因此,通过等值,员工可以处理该部门控制的所有项目。
虽然这在技术上是正确的,但它可能会有点奇怪。特别是如果部门5控制零项目的话。如果这是真的,那么查询将返回所有员工......这可能不是预期的结果。
答案 1 :(得分:0)
首先,MINUS
是Oracle术语。 SQL-Server使用EXCEPT
。有关详细信息,请阅读https://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-similar-to-minus-clause-in-oracle/。
其次,EXISTS
根据参数语句是否返回任何记录返回TRUE
或FALSE
结果。例如,EXISTS ( SELECT * FROM Employee WHERE Fname = 'John' )
将返回TRUE
,而EXISTS ( SELECT * FROM Employee WHERE Fname = 'Slartibartfast' )
将返回FALSE
。
https://www.w3schools.com/sql/sql_exists.asp给出EXISTS
的良好解释(带示例)。
EXISTS
子查询不需要引用主语句 - 它只需要在与EXISTS
返回TRUE
时相同的情况下返回至少一条记录。例如......
SELECT *
FROM Employee
WHERE Dno = 5
AND EXISTS ( SELECT Sex
FROM employee
WHERE Sex = 'M'
AND Dno = 5 )
如果Employee
至少有一个人Sex
,此查询将返回Dno
的所有记录(无论他们5
如何)Department
Sex = 'M'
{1}}。
至于NOT EXISTS
......
SELECT *
FROM Employee
WHERE Dno = 5
AND NOT EXISTS ( SELECT Sex
FROM employee
WHERE Sex = 'M'
AND Dno = 5 )
如果Employee
没有{},此查询将返回Sex
的所有记录(无论Dno
为5
Department
) em> Sex = 'M'
的人。
如果您有任何问题或意见,请随时发表评论。