架构图: 为涉及姓氏为“Smith”的员工(作为工人或作为控制项目的部门的经理)的项目列出项目编号。
给定的解决方案是:
但是,我相信只需使用以下表达式就足够了:
现在,我之所以相信这一点,主要是因为该EMPLOYEE
关系包含对应于工人和经理的元组。现在,员工可以是工人也可以是经理。所以,按照这个逻辑,上面的表达式应该足够了。我完全同意一个给定的查询可以通过多个关系代数表达式来表示的事实,但是按照给定的解决方案(更大的一个)上面的建议是非常多余的。
所以总结一下,我的思路对不对?
资料来源:Ramez Elmasri 和 Shamkant B. Navathe 的数据库系统基础,第 6 版,第 172 页查询 4。
试图找到一个更简单的解决方案是令人钦佩的,但你的表达方式有点错误。
问题的重要部分是:
请注意,这与“......或作为员工的经理......”不同。
让我们在那里抛出一些名字。
因此,请求的结果应在输出中包含项目 123,因为项目 123 由经理姓氏为 Smith 的部门控制。
您提出的解决方案将不包括 Project 123,因为 Ed 和他的经理都没有姓 Smith。
如果我们将第三步中的连接条件从 ssn==mgrssn 更改为 ssn=mgrssn AND lname="smith" 我们可以再次简单地通过仅获取 Dnumber 并将该关系与具有 dnumber=dnum 的项目连接以检索 smith 的 pno因此将步骤 3,4 和 5 减少到 2 个步骤。我希望我在这里有意义