假设我们有这个关系模式
homebuilder(hID,hName,hStreet,hCity,hZip,hPhone)
模型(hID,mID,mName,sqft,story)
细分(sName, sCity,sZip)
提供(sName,hID,mID,价格)
lot(sName, lotNum,lStAddr,lSize,lPremium)
已售出(sName,lotNum,hID,mID, 状态)
通过对每个细分进行关系代数我有问题,找到所提供的模型数量以及在该细分处提供的模型的平均,最小和最大价格。还以家庭平均价格的降序显示结果。
我已完成SQL公式,但我很难将此SQL转换为关系代数。有人能帮我吗? 这是我到目前为止所得到的:
SQL:=
SELECT S, avg (O.price), min (O.price), max (O.price), count(*)
FROM offered O, subdivision S
WHERE O.sName = S.sName
GROUP BY S.sName
ORDER BY 4 desc;
答案 0 :(得分:1)
+1给DPenner的评论:你不能在RA中订购。 (虽然那些q和a引用似乎有一些“困难”。)
你不能在RA中做的另一件事(与JaveLeave显示的SQL相反)是由position引用的匿名列。如果SQL是一种合理的语言(或者实际上是任何类型的语言),您可以在SELECT子句中命名列...,max(O.price)AS maxPrice,...然后是ORDER BY maxPrice desc。但不,你不能这样做。在SQL中,您必须重复ORDER BY max(O.price)desc。 (顺便说一下,问题是按平均价格排序,而不是max(?)那是第2列。)
对比RA组操作返回关系。作为一种关系,它必须具有只能通过名称寻址的属性。
回到问题所在的问题。最接近排序的是在每一行上放置一列,该行的序号位置相对于整个表。由于问题要求降序,第一步是找到具有最小平均价格的细分并用序数1标记。然后选择除了那个之外的全部,得到那些的最小值,用2标记它。一般来说:取所有都没有标记到目前为止;得到最小的;到目前为止用最高标签标记+1;递归。因此,您需要传递闭包操作(这是标准RA的另一个'缺失'功能)。您可以在comp.database.theory中找到一些SQL代码来实现这类功能 - 来自内存的Joe Celko给出了示例。
偏离主题:我很困惑为什么SQL中的课程/教授/教科书也要求你在RA中做不可能的事情。当然,在RA中有一个基础是好的。它是一个强大的心理模型,可以理解SQL只能模糊的数据结构。 RA(作为代数)是大多数SQL引擎的基础。但是,为什么留下RA对某种“表兄弟”来说是一种错误的印象呢? RA没有商业实施; RA程序员没有招聘广告。为什么要试着把它变成现实呢?