【问题标题】:display the order in relational algebra在关系代数中显示顺序
【发布时间】:2014-02-27 03:57:52
【问题描述】:

假设我们有这个关系模式

homebuilder(hID、hName、hStreet、hCity、hZip、hPhone)

model(hID, mID, mName, sqft, story)

细分(sName, sCity, sZip)

offered(sName, hID, mID, price)

lot(sName, lotNum, lStAddr, lSize, lPremium)

sold(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;

【问题讨论】:

  • 请注意,如herehere 所述,您不能在关系代数中进行排序。

标签: sql relational-algebra


【解决方案1】:

+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 程序员的招聘广告。为什么要尝试让它不是它的样子?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-11
    • 2020-03-06
    • 2013-01-20
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多