可以在关系代数,域和元组关系演算中表示所有SQL查询

问题描述 投票:2回答:4

我的查询包括有和计数或全部进入。如何在RA / DRC / TRC中表示?我还需要更简化SQL查询吗?这是一个简化的例子:

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

如果我要找到X市所有员工的经理(来自任何城市)的所有员工......我需要使用/ count。不确定如何在RA / DRC / TRC中完成此操作。

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

谢谢

sql database relational-database relational-algebra relational-division
4个回答
4
投票

您的查询有点含糊不清。确实有意找到所有经理,他们都是X市的每位员工的经理?

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

这是如何做 :

获取X市所有员工的集合。称之为EMPX。

获取所有经理的集合。称之为MGRS。

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

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

将差异计入管理器属性。该关系告诉您哪些经理存在,以便城市X中存在一些不由该经理管理的员工。

从MGRS中减去这种关系。显然,这种关系告诉您哪些管理者存在,以便不存在位于城市X中的员工,该员工不是由该管理者管理的。

将这种对存在量词的否定重写为通用量化将揭示这正是您想要的结果:不存在(EMP:EMP在X和EMP管理的EMP中)=== FOR FOR EMP:NOT(EMP在X中)和EMP管理的EMP)=== FORALL EMP :( EMP不在X或EMP中由MGR管理)=== FORALL EMP :(如果EMP在X中,则EMP由MGR管理)。

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

(侧面练习:如果根本没有员工位于X市,会发生什么。)


3
投票

关系部门是您具体示例的答案 - 您不需要聚合。分部是代数的一部分。

您更常见的问题是复杂的问题,因为确定何时可能的SQL结果与关系结果相同。是一个SQL查询返回相当于关系表达式的重复行而不是吗? SQL查询的SQL查询是否与任何关系表达式等效?如何仅使用SQL语法表示没有属性的关系投影?

我认为唯一明智的答案是说SQL模型和关系模型是两个完全不同且不兼容的东西。你可能不应该对他们之间的对应看起来太难。



-1
投票

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

编辑:

select  * 
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee
© www.soinside.com 2019 - 2024. All rights reserved.