我有一个问题,我有两个关系,一个包含属性song_id、song_name、album_id,另一个包含album_id 和album_name。我需要在歌曲关系中找到所有没有歌曲的专辑的名称。问题是我只能使用重命名、投影、选择、分组(使用 sum、min、max、count)、笛卡尔积和自然连接。我已经花了很多时间来解决这个问题,如果有任何帮助可以为我指明正确的方向,我将不胜感激。
2 回答
正如@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
。
由于这变得相当复杂,这里有一个关系代数表达式,用于捕捉上述英文解释:
请注意,n 是一个 1 x 1 关系,具有名为“count”的属性。
不可能。问题包括一个否定,并且在关系代数中,只能使用关系差异来表达,你似乎不允许使用它。
我很好奇你的老师提出了什么作为这个问题的解决方案。