我的查询包含一个having和count或all in。这些在RA/DRC/TRC中是如何表示的?我是否需要进一步简化我的SQL查询?下面是一个简单的例子:
empl(employee (primary key), city)
managers(employee (primary key), manager (foreign key of employee))
如果我要找到X市所有员工的所有经理(来自任何城市)…我需要用having/count。不确定在RA/DRC/TRC中如何做到这一点。
我知道需要这样一个查询可能没有意义,但假设它对于这个问题的目的是合理的。
谢谢
您的查询有点模棱两可。它的目的确实是找到所有的经理谁是在X城市的每一个员工的经理?
如portas所示,这在RA中是完全可行的。
方法如下:
获取x市所有员工的集合,称之为EMPX。
获取所有管理器的集合。叫它MGRS
求两者的笛卡尔积。叫它MGRS_EMPX
从中减去表的实际值(适当地向下投影到所需的属性),该值表示哪个经理管理哪个员工。这个差包含了所有真实存在的经理的组合,其中一个员工位于X,但该经理不管理该员工。
将差异投射到manager属性上。该关系告诉您存在哪些经理,使得X市存在某个员工不是由该经理管理的。
从MGRS中减去这个关系。显然,这个关系告诉你存在哪些经理,使得X城市不存在不受该经理管理的员工。
重写这个否定的存在量词作为通用量化将显示,这正是你想要的结果:不存在X和电磁脉冲(EMP:电磁脉冲是由经理)= = =给EMP:不是X和电磁脉冲(EMP是由经理)= = =给EMP: (EMP不在X或EMP由经理)= = =给EMP: X(如果EMP然后EMP由经理)。
这些都是很好的代数运算
(附带练习:看看如果X市没有员工会发生什么)
关系划分是您的特定示例的答案—您不需要聚合。除法是代数的一部分。
您更一般的问题是一个复杂的问题,因为确定任何可能的SQL结果何时与关系结果相同的问题。返回重复行的SQL查询是否等同于不返回重复行的关系表达式?SQL查询与SQL样式的空等价于任何关系表达式?如何仅使用SQL语法表示没有属性的关系投影?
我认为唯一合理的回答是说SQL模型和关系模型是两个完全不同和不兼容的东西。你可能不应该太费劲地寻找它们之间的对应关系。
聚合查询在RA中不可表示。
也许你把问题简单化了。但是为X市的员工找经理很简单——没有Count和Having。
编辑:select *
from managers m,
( select employee from empl where city = 'XXXXX' ) e
where m.employee = e.employee