在关系代数中选择“每个”中的一行

时间:2016-10-19 04:49:31

标签: join relational-algebra relational-division

假设我有一个Persons表,其中包含属性{name, pet}。我如何选择他们拥有各种宠物(dog, cat, bird)之一的人的名字,但如果他们的宠物在桌子上,那么一个人只有每种宠物中的一种。

示例:Bob, DogBob, Cat是表中的唯一行。因此,Bob拥有各种宠物中的一种。但是在添加Lynda, Bird的那一刻,Bob不再拥有每种宠物中的一种。

我认为第一步是π(pet)。你得到了各种宠物的清单,因为关系代数可以删除重复数据。不知道在此之后该怎么做,但我认为我需要加入π(pet)Persons

我尝试了一些像Natural Join和Cross产品的东西,但我还没有达到结果而且我没有想法。

1 个答案:

答案 0 :(得分:0)

可以使用Division operator

找到问题的答案

人÷π宠物(人)

此关系代数表达式仅返回与name列的关系,其中包含{{1}中存在目前所有不同种类宠物的人的所有姓名表自己。

除法是一个运算符,在某种意义上,它是乘积运算符的反转(名称完全取自这个事实)。它是一个派生运算符,可以根据投影,集合差异和乘积来定义(例如参见answer)。