2012-08-16 25 views
3

表:以上SQL到关系代数

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 statments转换为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) 

上述不完整的,我只需要知道,如果在正确的轨道上的IM。关于RA的信息有限。

回答

1

第一步是将查询放入单词中:询问什么?在这种情况下,我们需要所有音乐会的日期,其中演唱会的演出由'A'演唱,演唱会的大厅名为'B'。 (这一步并不总是必要的 - 在很多情况下,我们可能直接从SQL生成RA - 但确保您明白自己在做什么绝不是一个坏主意)。

因此,让我们从里到外构建您的RA声明。首先,我们希望确保在任何时候我们看同一场演出和音乐会,我们只在该演唱会上寻找演出,在这种情况下,演出的ID是一个音乐会场。所以你使用natural join/|><|的直觉是正确的。我一直都知道,除非另有说明,否则自然连接会自动匹配所有等效列名(尽管我会首先检查您的教师标准),因此在这种情况下,我们不需要指定连接条件ID的匹配。即使我们这样做了,那也是连接的下标,而不是选择语句的一部分。接下来我们要确保当我们看到一个大厅和一个节目时,我们只看那个大厅里的节目。所以我们想要自然的加入大厅以前的结果(注意加入顺序 - 如果还没有加入演出,你不能自然地加入音乐会和大厅)。

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

请注意,还有其他一些事情需要考虑。您可能需要考虑在每张桌上使用rename/rho以简化书写工作。此外,如果您的RA需要完全复制SQL,则必须使用重命名,并且用​​替换您的自然联接,并将联接条件放入您的select语句中。

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) 

我会尽快与使用一个多种变异更新|> < |运营商,如果你想......

+2

您可能想再看看给出的SQL。在'WHERE'子句中给出了连接条件,你忽略了。另外,在这里做什么'学期='F1995'? – Jodaka 2012-09-23 15:15:41