1

我的查询包括有和计数或全部。这些在 RA/DRC/TRC 中如何表示?我是否必须进一步简化我的 SQL 查询?这是一个简化的示例:

empl(employee (primary key), city)
managers(employee (primary key), manager (foreign key of employee))

如果我要找到 X 市所有员工的经理(来自任何城市)的所有员工。我需要使用拥有/计数。不知道这将如何在 RA/DRC/TRC 中完成。

我知道需要这样的查询可能没有意义,但假设它对于这个问题的目的是明智的。

谢谢

4

4 回答 4

4

您的查询表述有点模棱两可。确实是打算找到所有经理,他们是 X 市每个员工的经理?

正如 dportas 所指出的,这在 RA 中是完全可行的。

就是这样 :

获取 X 市所有员工的集合。调用那个 EMPX。

获取所有管理器的集合。称其为 MGRS。

制作两者的笛卡尔积。称其为 MGRS_EMPX。

从中减去表的实际值(适当地投影到所需的属性),该值表示哪些经理管理哪些员工。这种差异包含真正存在的所有经理组合,其中一名员工位于 X 中,但该经理不管理该员工。

将该差异投射到 manager 属性上。该关系告诉您存在哪些经理,因此在 X 市存在一些不受该经理管理的员工。

从 MGRS 中减去这个关系。显然,这种关系告诉您存在哪些经理,因此不存在位于 X 市且不受该经理管理的员工。

将存在量词的否定重写为全称量词将揭示这正是您想要的结果:不存在(EMP:EMP 在 X 中并且 EMP 由 MGR 管理)=== FORALL EMP:不(EMP 在 X 中AND EMP 由 MGR 管理)=== FORALL EMP:(EMP 不在 X 中或 EMP 由 MGR 管理)=== FORALL EMP:(如果 EMP 在 X 中,则 EMP 由 MGR 管理)。

所有这些都是非常精细的代数运算。

(附带练习:看看如果 X 市根本没有员工会发生什么。)

于 2011-10-11T23:16:28.200 回答
3

关系部门是您特定示例的答案 - 您不需要聚合。除法是代数的一部分。

您的更一般的问题是一个复杂的问题,因为确定任何可能的 SQL 结果何时与关系结果相同的问题。返回重复行的 SQL 查询是否等同于不返回重复行的关系表达式?具有 SQL 样式空值的 SQL 查询是否等同于任何关系表达式?您如何仅使用 SQL 语法在没有属性的情况下表达关系投影?

我认为唯一明智的答案是说 SQL 模型和关系模型是两个完全不同且不兼容的东西。您可能不应该过于努力地寻找它们之间的对应关系。

于 2011-10-11T21:00:05.080 回答
1

聚合查询在 RA 中不可表达

于 2011-10-11T20:31:56.660 回答
-1

也许您过于简单化了您的问题..但是在 X 市为员工寻找经理是一个简单的加入 - 没有计数或拥有。

编辑:

select  * 
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee
于 2011-10-11T20:39:17.850 回答