给定查询的关系代数表达式

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