【问题标题】:relational algebra of the query查询的关系代数
【发布时间】:2017-07-28 17:34:03
【问题描述】:

考虑以下关系数据库方案:

COURSES (Cno,name)
PRE-REQ(Cno, pre-Cno)
COMPLETED (student_no, Cno)

COURSES 给出所有可用课程的编号和名称。

PRE-REQ 提供有关哪些课程是给定课程的先决条件的信息。

COMPLETED 表示学生已经完成了哪些课程

使用关系代数表达以下内容:

列出 student_no = 2310 的学生已完成所有先决条件的所有课程。

该问题可以通过 SQL 查询来解决,但无法导出等价的关系代数。

【问题讨论】:

  • 我投票决定将此问题作为题外话结束,因为它与软件开发无关,而且是家庭作业问题,没有付出任何努力来解决它。
  • 我尝试过使用除法运算符(%),但它不正确。
  • 所以你可以给出你用过的SQL;以及您尝试过的除法;并解释为什么它不正确。这将显示您付出了多少努力。也许@EpicPandaForce 更愿意将关系代数问题转到 cs.stackexchange?
  • @AntC 好吧,它 is 比 SO 更适合那里。请记住,最初的问题仅包含要解决的任务,有点像直接从测试作业中得出。
  • SELECT cno FROM Completed, Pre-Req WHERE student_no = '2310' GROUP BY CNO HAVING pre-Cno IN (SELECT C.cno FROM Completed AS C WHERE C.student_no = '2310'; )

标签: database relational-algebra


【解决方案1】:

这是 RA 的 TUTORIAL D 变体中的答案:

WITH { COMPL_2310 := (COMPLETED WHERE student_no = '2310')
                      { Cno } RENAME { Cno AS pre-Cno }
     }
COURSES WHERE ( ( RELATION{ TUPLE{*} } JOIN PRE_REQ ){ pre-Cno }
              ⊆
                COMPL_2310
              )

(与 Date & Darwen 的教科书相比,它使用了一些最近引入的语法糖和替代语法。)

【讨论】:

    【解决方案2】:

    这可能是正确的答案

    ΠCno(PRE-REQ) - ΠCno( PRE-REQ - (COMPLETED ⋈COMPLETED.Cno=pre-Cno ^ student_no=2310 前置请求 ))

    【讨论】:

    • 为什么会这样?为什么不?此查询无效,因为- 要求参数列集相同。
    • 两者都有相同的列集,即 {Cno}
    • 第二个-。请解决我对这个问题的评论。 3404097 例如,由于您没有给出要使用的 RA 参考,我们无法确定最右边的连接结果的列。但它们与 PRE-REQ 不同。而且我们不知道我们可以使用哪些运算符。甚至什么是“关系”。 PSstackoverflow.com/a/44411096/3404097stackoverflow.com/a/24425914
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多