我试图更好地理解关系代数,并且无法解决以下类型的问题:
假设有一列A(部门),一列B(员工)和一列C(经理)。我怎样才能找到所有员工中只有一名经理的部门?下面提供了一个示例:
Department | Employees | Managers
-------------+-------------+----------
A | John | Bob
A | Sue | Sam
B | Jim | Don
B | Alex | Don
C | Jason | Xie
C | Greg | Xie
在此表中,我得到的结果是包含部门B和C的所有元组,因为他们的所有员工都由同一个人管理(分别是Don和Xie)。但是,部门A不会被退回,因为它的员工有多个经理。
任何帮助或指示都将不胜感激。
答案 0 :(得分:0)
如果您的RDBMS支持公用表表达式:
with C as (
select department, manager, count(*) as cnt
from A
group by department, manager
),
B as (
select department, count(*) as cnt
from A group by department
)
select A.*
from A
join C on A.department = C.department
join B on A.department = B.department
where B.cnt = C.cnt;
答案 1 :(得分:0)
这些问题通常需要自我加入。
将关系连接到Department上,然后过滤出Managers相等的元组会产生所有不需要的元组,我们可以从原始关系中减去它们。
以下是我的表现:
首先我们复制表T,并将其称为T2,然后取T和T2的叉积。从结果我们选择T1.Manager / = T2.Manager但T1.Department = T2.Department的所有行,让我们得到这些元组:
T1.Department | T1.Employees| T1.Managers | T2.Managers | T2.Employees | T2.Department
--------------+-------------+-------------+-------------+--------------+--------------
A | John | Bob | Sam | Sue | A
A | Sue | Sam | Bob | John | A
部门A和B不存在,因为他们的T1.Manager总是等于T2.Manager。
然后我们只是将这个结果减去原始集合以得到答案。