SQL到关系代数

时间:2012-08-16 14:00:50

标签: sql relational-algebra

表:

Show(show_id, title, start_date, duration,singer,hall_id)
Concert(concert_is,date,hour,show_id)
Hall(Hall_id, name, address, capacity)

以上是3个表的DB。我需要将一些简单的SQL语句转换为RA:

SELECT date
FROM Concert C, Show S, Hall H
WHERE C.show_id = S.Show_id
AND S.hall_id = H.hall_id
AND S.singer = 'A'
AND H.name = 'B'

在RA中:

pi date (s(show_id = show_id)Show |><| Concert)

以上内容并不完整,我只需要知道我是否在正确的轨道上。关于RA的信息有限。

2 个答案:

答案 0 :(得分:1)

这里使用“NATURAL JOIN”进行一次拍摄。另请注意,我没有使用您的元组变量:

pi date (sigma name = 'B' AND singer = 'A' (CONCERT x SHOW x HALL))

上面的表达式是评估SQL查询的最低效率之一;但是,从语法上来说,它更接近你的SQL。

这是我使用的查询模板:

pi TargetList sigmaSelection_Condition (REL1 x ... X RELn)

我将很快更新另一个使用您的|&gt;&lt; |的变体操作员,如果你想......

答案 1 :(得分:1)

第一步是将查询置于单词中:问题是什么?在这种情况下,我们想要所有音乐会的日期,音乐会上的演出由'A'演唱,音乐会所在的大厅被命名为'B'。 (这个步骤并不总是必要的 - 在很多情况下,我们可能直接从SQL生成RA - 但确保你理解你正在做什么并不是一个坏主意。)

所以让我们从内到外构建你的RA语句。首先,我们要确保无论何时我们同时观看一场演出和一场音乐会,我们只会在该音乐会上寻找该节目,在这种情况下,该节目的id是一场音乐会。所以你使用natural join/|><|的直觉是正确的。我总是了解到,除非另有说明,否则自然连接将自动匹配所有等效的列名称(虽然我会先检查您老师的标准),所以在这种情况下,我们不需要指定显示的连接条件id的比赛。即使我们这样做,那也是连接的下标,而不是select语句的一部分。接下来我们要确保当我们看一个大厅和一个节目时,我们只看那个大厅里的节目。所以我们想要自然加入大厅到之前的结果(请注意加入的顺序 - 如果还没有参加演出,你就不能自然地加入音乐会和大厅。)

下一步是只获取我们想要的信息行。在这种情况下,select/sigma语句非常简单 - 只需指定名称和大厅必须是您想要的。最后,我们project/pi只从我们检索到的行中获取所需的数据元素 - 在这种情况下,我们只会预测日期。在那之后,我们完成了。到目前为止,从你的RA中,我可以看到你已经拥有了正确顺序的所有运算符,你只是错过了操作数!

请注意,还有一些其他事项需要考虑。您可能需要考虑在每个表上使用rename/rho来简化编写操作。此外,如果你的RA需要完全复制SQL,你必须使用重命名,并用cross join/X替换你的自然连接,并将连接条件放在你的select语句中。