我必须为查询编写关系代数表达式,以便构建和优化查询树。我无法理解如何为涉及连接多个关系的查询编写表达式。
关系是,
供应商( snum ,姓名,地址,bdate,性别,pnum)
植物( pnum ,mgrnum,位置)
项目(项目#,位置,pnum)
卖出( snum,item#,数量)
工厂的Mgrnum是供应商表(外键)中的经理的snum。
查询是,
对于位于“丹佛”的每个项目,检索项目编号,控制工厂编号以及工厂经理的姓名,地址和出生日期。
我喜欢首先使用笛卡尔积来写这个而不是使用连接,所以我可以绘制初始查询树。
这是朋友的尝试:
PROJECT item#,pnum,mgrnum,address,bdate((SELECT location ='Denver'(Plant)x Item)JOIN mgrnum = snum(供应商))
我正在努力了解如何得出这个答案。 谢谢。
答案 0 :(得分:0)
对于位于“丹佛”的每个项目,检索项目编号,控制工厂编号以及工厂经理的姓名,地址和出生日期。
由于这是作业,这里有一个提示。您显然希望item#, pnum, name, bdate
行位于:
(for some sex, mgrnum, location, snum,
snum called name occupying address born bdate is sex and manages pnum
and item# in location is controlled by pnum
and location = 'Denver')
(猜测表格的含义以及适用的商业规则,因为您没有明确解释。)
让我们使用一个明显的简写:
(for some sex, mgrnum, location, snum,
Supplier(snum, name, address, bdate, sex, pnum)
and Item(item#, location, pnum)
and location = 'Denver')
回想一下,PROJECT保持/删除属性,RESTRICT / SELECT保持/删除元组,如果关系R& S持有从谓词 R(...)&中生成真实语句的元组。 S(...)(分别)然后R NATURAL JOIN S返回R(...)和S(...)的元组。 (见this answer。也是我对Relational Algebra Cross Product and Natural Join的回答。)