在有条件的经典关系代数中找到模式

时间:2019-10-12 13:17:23

标签: relational-database relational-algebra

我给了一个有两列的表:id_ship和date。我需要找到出现次数最多的船只的ID(即日期最多的船只),假设船只的日期不能超过三个。

仅需从表的三重笛卡尔乘积中进行选择,即可轻松找到具有三个日期的飞船的ID。但是,我无法检查获得的结果是否为空。如果不为空,则必须选择此视图;如果为空,则需要查找有两个日期的船,然后再次检查是否为空。我该如何进行?请记住,我不能使用扩展关系代数,因此使用聚合函数或扩展投影是无效的。

编辑:对不起,我认为“经典关系代数”的概念是标准的。该操作说明。我的RA支持的操作是: 选择,项目,重命名,并集,差,相交,笛卡尔乘积,自然连接,条件和分割连接

1 个答案:

答案 0 :(得分:1)

此练习的目的是避免聚合运算符或分组。这将很好地说明为什么它们有用。

因此,您说的是,给定表中的每个id_ship都可能出现3、2或1次。大概对于您的“三重笛卡尔乘积”(这将是具有重命名的自乘积),您将产生一行,其中三个日期从左到右递增(因此您可以检查自乘积是否重复)日期)。

好,那么对于2次出现的情况,您需要一个双笛卡尔乘积,日期从左到右递增。排除那些已经出现在三元组中的id-ship

对于1次出现的情况,请排除以上任一出现的id-ship

然后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;全部支持预测,这是从3个单独的查询结果中获取id-ship所需要的。

假设您的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 operation