如何查找其子类别B都与同一列C相关的所有列A?

时间:2014-10-09 00:20:03

标签: sql database relational-algebra

我试图更好地理解关系代数,并且无法解决以下类型的问题:

假设有一列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不会被退回,因为它的员工有多个经理。

任何帮助或指示都将不胜感激。

2 个答案:

答案 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 - \pi_{T.Department, T.Employee, T.Manager} \left( \sigma_{T.Manager \neq  T2.Manager \land T.Department = T2.Department}\left(\rho(T, T_2) \times T\right) \right)

首先我们复制表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。

然后我们只是将这个结果减去原始集合以得到答案。