Я знаю, что этот вопрос уже задан здесь .
Но там нет правильного ответа.
Рассмотрим следующие схемы реляционных баз данных:
КУРСЫ (Cno.name)
PRE-REQ (Cno, pre-Cno)
ВЫПОЛНЕНО (student_no, Cno)
КУРСЫ дают номер и название всех доступных курсов.
PRE-REQ предоставляет информацию о том, какие курсы являются обязательными для данного курса.
ЗАВЕРШЕНО указывает, какие курсы были пройдены студентами
Выразите следующее, используя реляционную алгебру:
Перечислите все курсы, для которых студент с 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 is-
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';
)
Есть ли другой возможный способ записи в виде выражения реляционной алгебры?