您好,在我的考试复习中,我选择了以下关系代数示例问题:
employee (+person_name, street, city) works (+person_name, company_name, salary) company (+company_name, city) manages (+person_name, manager_name)
表示主键列+
查找与其经理居住在同一城市、同一条街道的所有员工的姓名。
这是我的解决方案:
JOIN manages and employee (OVER person_name) GIVING T1
JOIN manages and employee (OVER manager_name) GIVING T2
PROJECT T1 over person_name, street, city GIVING T3
PROJECT T2 over street, city GIVING T4
T3 intersect T4 GIVING T5
PROJECT T5 over person_name GIVING RESULT
但是交集必须是并集兼容的(列数及其名称匹配)。
如果我将第 3 行更改为
PROJECT T1 over street, city GIVING T3
那么我将永远没有机会将交集的结果链接回 person_name。
如果我将第 4 行更改为
PROJECT T2 over person_name, street, city GIVING T4
然后在十字路口我永远不会遇到一个除了他自己之外还有其他经理的人。
什么是提示?
问题的另一种表达方式:对于每个经理+人员对,找到两个人的相关城市+州相同的那些。 你差点就这么做了:
JOIN manages AND employee (OVER person_name) GIVING T1
JOIN T1 AND employee (OVER manager_name, street, city) GIVING T2
PROJECT T2 OVER person_name, manager_name, street, city GIVING RESULT
问题陈述不需要在单列中返回名称,并且此答案提供了有用的结果。 如果需要,您可以重复上述查询,取两个投影的并集:一个是 person_name,另一个是 manager_name。
只有一件事:许多经理会反对一个名为“人员”的栏目和另一个名为“经理”的栏目,因为几乎每个经理 - 也许不管你的经验如何? ——认为自己是一个人。 更可接受的配对可能是经理/工人、领主/农奴、主/从等。