给定查询的关系代数表达式
Relational Algebra expression for the given query
我知道这个问题已经有人问过 here。
但是那里没有正确回答。
Q) 考虑以下关系数据库方案:
课程(Cno.name)
PRE-REQ(Cno, pre-Cno)
完成(student_no,Cno)
COURSES 给出所有可用课程的编号和名称。
PRE-REQ 提供有关哪些课程是给定课程的先决条件的信息。
COMPLETED 表示学生已经完成了哪些课程
Express the following using relational algebra:
List all the courses for which a student with student_no 2310 has
completed all the pre-requisites.
已给出答案 here:
S ← π Cno (σ student_no=2310 (COMPLETED))
RESULT ← ((ρ (Course,Cno) (PRE−REQ))÷S)
但我发现了其中的一个缺陷。
假设
PRE-REQ COMPLETED
Cno Pre-Cno Student_no Cno
C1 C3 2310 C3
C2 C4 2310 C4
期望的结果应该是 C1、C2,但我的查询将 return 一个空关系,因为 C1 没有 C4 作为其先决条件,同样,C2 没有 C3 作为其先决条件-必修课。
S RESULT
Cno Course Cno
C3
C4
答案here中给出的另一种解决方案,但使用SQL是-
SELECT Pre-Req.Cno
FROM Completed, Pre-Req
WHERE student_no = '2310'
GROUP BY Pre-req.Cno
HAVING pre-Cno IN (
SELECT C.cno
FROM Completed AS C
WHERE C.student_no = '2310';
)
是否有任何其他可能的方式将 is 写成关系代数表达式?
这是一个可能的解决方案(我将使用更简单的表示法):
COURSES_OF_2310 = π c←Cno (σ student_no=2310 (COMPLETED))
PARTIALLY_SATISFIED = PRE_REQ ⨝ PRE_REQ.preCno=c COURSES_OF_2310
NOT_SATISFIED = PRE_REQ - π Cno, preCno←c PARTIALLY_SATISFIED
FULLY_SATISFIED = π Cno PRE_REQ - π Cno (NOT_SATISFIED)
这很复杂,可能可以简化。但是它现在应该可以工作了。这是使用 RelaX:
测试的示例
COURSES(Cno)
C1
C2
C3
C4
C5
C6
PRE-REQ(Cno, pre-Cno)
C1 C3
C1 C4
C2 C3
C2 C4
C5 C3
C5 C6
C6 C4
COMPLETED(student_no, Cno)
2310 C3
2310 C4
PARTIALLY_SATISFIED(Cno, preCno c)
C1 C3 C3
C1 C4 C4
C2 C3 C3
C2 C4 C4
C5 C3 C3
C6 C4 C4
NOT_SATISFIED(Cno, preCno)
C5 C6
FULLY_SATISFIED(Cno)
C1
C2
C6
我知道这个问题已经有人问过 here。 但是那里没有正确回答。
Q) 考虑以下关系数据库方案:
课程(Cno.name)
PRE-REQ(Cno, pre-Cno)
完成(student_no,Cno)
COURSES 给出所有可用课程的编号和名称。
PRE-REQ 提供有关哪些课程是给定课程的先决条件的信息。
COMPLETED 表示学生已经完成了哪些课程
Express the following using relational algebra:
List all the courses for which a student with student_no 2310 has completed all the pre-requisites.
已给出答案 here:
S ← π Cno (σ student_no=2310 (COMPLETED))
RESULT ← ((ρ (Course,Cno) (PRE−REQ))÷S)
但我发现了其中的一个缺陷。 假设
PRE-REQ COMPLETED
Cno Pre-Cno Student_no Cno
C1 C3 2310 C3
C2 C4 2310 C4
期望的结果应该是 C1、C2,但我的查询将 return 一个空关系,因为 C1 没有 C4 作为其先决条件,同样,C2 没有 C3 作为其先决条件-必修课。
S RESULT
Cno Course Cno
C3
C4
答案here中给出的另一种解决方案,但使用SQL是-
SELECT Pre-Req.Cno
FROM Completed, Pre-Req
WHERE student_no = '2310'
GROUP BY Pre-req.Cno
HAVING pre-Cno IN (
SELECT C.cno
FROM Completed AS C
WHERE C.student_no = '2310';
)
是否有任何其他可能的方式将 is 写成关系代数表达式?
这是一个可能的解决方案(我将使用更简单的表示法):
COURSES_OF_2310 = π c←Cno (σ student_no=2310 (COMPLETED))
PARTIALLY_SATISFIED = PRE_REQ ⨝ PRE_REQ.preCno=c COURSES_OF_2310
NOT_SATISFIED = PRE_REQ - π Cno, preCno←c PARTIALLY_SATISFIED
FULLY_SATISFIED = π Cno PRE_REQ - π Cno (NOT_SATISFIED)
这很复杂,可能可以简化。但是它现在应该可以工作了。这是使用 RelaX:
测试的示例COURSES(Cno)
C1
C2
C3
C4
C5
C6
PRE-REQ(Cno, pre-Cno)
C1 C3
C1 C4
C2 C3
C2 C4
C5 C3
C5 C6
C6 C4
COMPLETED(student_no, Cno)
2310 C3
2310 C4
PARTIALLY_SATISFIED(Cno, preCno c)
C1 C3 C3
C1 C4 C4
C2 C3 C3
C2 C4 C4
C5 C3 C3
C6 C4 C4
NOT_SATISFIED(Cno, preCno)
C5 C6
FULLY_SATISFIED(Cno)
C1
C2
C6