-1

我有一个问题,我有两个关系,一个包含属性song_id、song_name、album_id,另一个包含album_id 和album_name。我需要在歌曲关系中找到所有没有歌曲的专辑的名称。问题是我只能使用重命名、投影、选择、分组(使用 sum、min、max、count)、笛卡尔积和自然连接。我已经花了很多时间来解决这个问题,如果有任何帮助可以为我指明正确的方向,我将不胜感激。

4

2 回答 2

1

正如@ErwinSmout 指出的那样,差异通常是一种简单的方法。但是由于您不能使用它,因此使用计数有一个棘手的解决方法。我假设album_id歌曲关系中的每个存在也存在于albums关系中。

PROJECT来自歌曲关系的 album_id(请注意,关系代数PROJECT相当于 SQL 的SELECT DISTINCT)。我将调用此关系song_albums。现在让我们计算albums关系的计数,称为 m,并计算新表的计数,称为 n。

取专辑关系和 song_albums 关系的笛卡尔积。这个新关系有 m*n 行。现在,如果您进行计数,按 分组album_name,则每个 malbum_name的计数为 n。不是很有帮助。

但是现在,我们SELECT从关系行 where albums.album_id != song_albums.album_id。现在,如果您进行按 分组album_name的计数,则不在原始关系中的那些专辑的计数songs将为 n,而最初在其中的那些专辑的计数将小于 n,因为将根据如何删除行与那张专辑的许多歌曲都在原始songs关系中。


编辑:事实证明,这不是一个严格的关系代数解决方案:在 SQL 中,一个 1 x 1 表,例如包含的表,n可以简单地被视为一个整数并用于相等比较。但是,根据维基百科,选择必须在关系的两个属性之间进行比较,或者在一个属性和一个量值之间进行比较。

另一个障碍将由另一个不推荐的笛卡尔积来解决:我们可以将包含n我们最近的关系的 1 x 1 关系的笛卡尔积取为。现在我们可以进行适当的关系代数选择,因为我们有一个始终等于 的属性n

由于这变得相当复杂,这里有一个关系代数表达式,用于捕捉上述英文解释:

关系代数 1

关系代数 2

关系代数 3

关系代数 4

请注意,n 是一个 1 x 1 关系,具有名为“count”的属性。

于 2013-02-10T02:47:19.040 回答
0

不可能。问题包括一个否定,并且在关系代数中,只能使用关系差异来表达,你似乎不允许使用它。

我很好奇你的老师提出了什么作为这个问题的解决方案。

于 2013-02-09T14:22:10.493 回答