如何用关系代数查询所有员工薪资均超30000的部门名称?
解决关系代数题:找出所有员工薪资均大于30000的部门名称
嘿,我来帮你理清这道题的问题所在,再给你正确的解法~
首先得指出你当前尝试的两个核心问题:
- 你的第一步聚合后得到的
NewRelation只有dname和empCount字段,完全没有salary,所以第二步用σ salary>30000筛选根本不成立,字段不存在。 - 更关键的是逻辑偏差:你要找的是部门里所有员工薪资都>30000,而不是“部门里有员工薪资>30000”,你的思路完全没抓住这个核心要求。
下面用你指定的符号(G作为聚合函数标识)给出两种正确的解法:
解法一:补集思路(反证法)
通过排除存在低薪员工的部门,剩下的就是符合要求的部门:
- 先找出所有存在薪资≤30000员工的部门:
BadDepts(dname) <- ∏ dname (σ salary<=30000 (Employee ⋈ dept=deptNo Department)) - 从所有部门中剔除这些“坏部门”:
∏ dname (Department) - BadDepts
解法二:聚合统计最低薪资
直接统计每个部门的最低工资,只要最低工资都超过30000,那部门内所有员工薪资肯定都达标:
- 连接员工和部门表,按部门名称分组,计算每个部门的最低工资:
DeptSalaries(dname, min_salary) <- dname G min(salary) (Employee ⋈ dept=deptNo Department) - 筛选出最低工资>30000的部门名称:
∏ dname (σ min_salary>30000 (DeptSalaries))
这两种方法都能准确实现需求,你可以根据自己的理解选择其中一种~
内容的提问来源于stack exchange,提问作者Jananath Banuka
相关产品推荐
相关产品推荐

