我遇到一个问题,我有两个关系,一个包含属性song_id,song_name,album_id,另一个包含album_id和album_name。我需要找到歌曲关系中没有歌曲的所有专辑的名字。问题是我只能使用重命名,投影,选择,分组(总和,最小,最大,计数),笛卡尔积和自然连接。我花了很多时间在这方面工作,并感谢任何指导我正确方向的帮助。
答案 0 :(得分:1)
正如@ErwinSmout指出的那样,差异通常是一种简单的方法。但由于你不能使用它,使用计数有一个棘手的解决方法。我假设歌曲关系中出现的每个album_id
也出现在albums
关系中。
PROJECT
album_id(注意关系代数的PROJECT
等同于SQL的SELECT DISTINCT
)。我将这种关系称为song_albums
。现在让我们计算albums
关系,调用这个m,然后取新表的计数,调用它。
获取相册关系的笛卡尔积和song_albums关系。这个新关系有m * n行。现在,如果您按album_name
分组计数,则每个m album_name
的计数都为n。不是很有帮助。
但是现在,我们SELECT
来自albums.album_id != song_albums.album_id
的关系行。现在,如果您按album_name
分组计数,那些不在原始songs
关系中的相册的计数将为n,而原来在那里的那些将具有小于n的计数,因为根据该专辑中原始songs
关系中的歌曲数量而删除了行。
编辑:事实证明,这不是严格关系代数解决方案:在SQL中,1 x 1表,例如包含{可以简单地将{1}}视为整数并用于相等比较。但是,根据维基百科,selection必须对关系的两个属性或属性和常量值进行比较。
另一个不明智的笛卡尔积将处理的另一个障碍:我们可以将包含n
的1 x 1关系的笛卡尔积与我们最近的关系联系起来。现在我们可以进行适当的关系代数选择,因为我们有一个总是等于n
的属性。
由于这已经变得相当复杂,这里有一个关系代数表达式来捕捉上述英语解释:
请注意,n与名为“count”的属性的关系为1 x 1。
答案 1 :(得分:0)
这是不可能的。问题包括否定,在关系代数中,只能使用关系差异表示,你似乎不允许使用关系差异。
我很想知道你老师提出的解决这个问题的方法。