提供的型号数量以及每个细分提供的型号的平均、最低和最高价格

问题描述 投票:0回答:1
homebuilder (hID, hName, hStreet, hCity, hZip, hPhone)
model (hID, mID, mName, sqft, story)
subdivision (sName, sCity, sZip)
offered (sName, hID, mID, price)
lot (sName, lotNum, lStAddr, lSize, lPremium)
sold (sName, lotNum, hID, mID, status)

我正在尝试查找提供的型号数量以及每个细分提供的型号的平均、最低和最高价格,按房屋平均价格的降序排列。

如何将此 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;
sql relational-algebra
1个回答
2
投票

+1 DPenner 的评论:确实,你不能在 RA 中订购。 (虽然引用的那些q和a似乎有一些“困难”。)

在 RA 中不能做的另一件事(与 JaveLeave 显示的 SQL 相反)是按位置引用匿名列。如果 SQL 是一种合理的语言(或者实际上是任何类型的语言),您可以在 SELECT 子句中命名列 ..., max (O.price) AS maxPrice, ... 然后 ORDER BY maxPrice desc。但不,你不能那样做。在 SQL 中,您必须重复 ORDER BY max (O.price) desc。 (顺便说一句,问题要求按平均价格排序,而不是 max(?) 这是第 2 列。)

对比RA Group操作返回一个关系。作为一种关系,它必须具有只能通过名称寻址的属性。

回到所问的问题。最接近的排序是在每行上放置一列,并显示该行相对于整个表的序号位置。由于问题要求降序排列,第一步是找到平均价格最小的细分,并用序数 1 标记它。然后选择除该细分之外的所有细分,获取其中的最小值,用 2 标记它。一般来说:取到目前为止,所有内容均未标记;得到最小值;给它加上迄今为止最高的标签+1;递归。因此,您需要传递闭包操作(这是标准 RA 的另一个“缺失”功能)。你可以在 comp.database.theory 中找到一些 SQL 代码来实现这类事情——凭记忆 Joe Celko 给出了例子。

题外话:我很困惑为什么 SQL 的课程/教授/教科书也要求你在 RA 中做不可能的事情。当然,有 RA 基础是件好事。它是一个强大的思维模型,可以理解 SQL 所掩盖的数据结构。 RA(作为代数)支撑着大多数 SQL 引擎。但为什么要给人留下 RA 是 SQL 的“可怜的表亲”的印象呢? RA 没有商业实施;没有针对 RA 程序员的招聘广告。为什么要尝试把它变成它不该有的样子?

© www.soinside.com 2019 - 2024. All rights reserved.