我知道这个问题已经被问到了here。但那里没有得到妥善回答。
请考虑以下关系数据库方案:
课程(Cno.name) PREREQ(Cno,前Cno) 已完成(学生编号,Cno)
课程提供所有可用课程的编号和名称。 PRE-REQ提供有关哪些课程是特定课程的先决条件的信息。 COMPLETED表示学生已完成哪些课程
使用关系代数表达以下内容:
列出student_no 2310学生已完成所有先决条件的所有课程。
我的尝试 -
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但是我的查询将返回一个空关系,因为C1没有C4作为它的必备课程,类似地C2没有C3作为它的必备课程。
S RESULT
Cno Course Cno
C3
C4
可能的解决方案我可以通过使用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';
)
有没有其他可能的写作方式作为关系代数表达式?
这是一个可能的解决方案(我将使用更简单的表示法):
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