关系代数表达式 -

问题描述 投票:-1回答:1

我知道这个问题已经被问到了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)

same expression

但我发现它有一个缺陷。假设

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';
    )

有没有其他可能的写作方式作为关系代数表达式?

database relational-algebra
1个回答
0
投票

这是一个可能的解决方案(我将使用更简单的表示法):

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
© www.soinside.com 2019 - 2024. All rights reserved.