relational-database - 在有界条件的经典关系代数中找到模式
问题描述
我得到一个包含两列的表:id_ship 和日期。假设一艘船的日期不能超过三个,我需要找到出现次数最多的船只的 ID(即日期最多的船只)。
很容易找到具有三个日期的船舶的 ID,只需从表的三重笛卡尔积中进行选择。但是,我无法检查获得的结果是否为空。如果它不是空的,我将不得不选择这个视图,而如果它是空的,我需要寻找有两个日期的船并再次检查它是否是空的。我该如何进行?请记住,我不能使用扩展关系代数,因此使用聚合函数或扩展投影是无效的。
编辑:对不起,我认为“经典关系代数”这个概念是标准的。那个操作。我的RA支持的操作有:select、project、rename、union、diff、intersect、cartesian product、natural join、join with condition和division
解决方案
本练习的目的是避免聚合运算符或分组。这将很好地证明为什么这些是有用的。
所以你是说对于id_ship
给定表中的每个,可能有 3、2 或 1 次出现。大概对于您的“三重笛卡尔积”(这将是一个重命名的自积),您将生成一行,其中三个日期从左到右升序(这样您就可以检查自积不重复日期)。
好的,那么对于 2 次出现的情况,您需要一个双笛卡尔积,日期从左到右升序。排除那些id-ship
已经出现在三元组中的 s。
对于 1 次出现的情况,排除id-ship
出现在上述任一情况中的 s。
然后UNION
把三个结果加在一起:
SELECT id-ship, 3 AS count
FROM occ3
UNION
SELECT id-ship, 2 AS count
FROM occ2
UNION
SELECT id-ship, 1 AS count
FROM occ1 ;
现在您有了一个带有计数的传统组样式表。
啊,但是你想要的是 RA 而不是 SQL?然后我们遇到了哪个版本的RA的困难。这些版本的不同之处在于可用的运算符。例如,'granddaddy' Codd 1972 版本甚至不包含重命名,因此您甚至无法生成三重笛卡尔积。
所有版本都支持UNION
OK;all 支持投影,这是您id-ship
从 3 个单独的查询结果中获取所需的。
假设您的 RA 支持关系文字:{{count 3}}
是一组(单例)元组,每个元组是一组属性名称-值对
(pi<id-ship>(occ3) x {{count 3}})
UNION
(pi<id-ship>(occ2) x {{count 2}})
UNION
(pi<id-ship>(occ1) x {{count 1}})
如果您的 RA 不支持关系文字,它可能支持EXTEND
操作
推荐阅读
- printing - 如何固定单元格中表单控件的位置(宽度和高度)
- git - 如何将一个分支中的文件和更改复制到另一个分支
- google-cloud-platform - 在 Google Cloud Pub/Sub 中处理订阅过滤器更改的最佳方式是什么?
- python - 转换字典中的整数键值
- amazon-web-services - aws上的docker runner没有运行作业
- bezier - 如何在inkscape中绘制四次贝塞尔曲线
- r - R中部分依赖图的计算限制
- linux - 如果系统调用发生得更频繁,内核跟踪点挂钩将花费更少的时间来运行
- python - Django/Postgres 集成问题
- selenium-webdriver - Jenkins+Docker+Grid 执行 - UnreachableBrowserException:无法启动新会话