Я думаю, что следующее будет делать большую часть того, что вы хотите:
Table COURSE
ID_COURSE NUMBER PRIMARY KEY
DESCRIPTION VARCHAR2(200)
Table PREREQUISITE_COURSE
ID_COURSE NUMBER REFERENCES COURSE.ID_COURSE
ID_PREREQ_COURSE NUMBER REFERENCES COURSE.ID_COURSE
PRIMARY KEY (ID_COURSE, ID_PREREQ_COURSE)
Table STUDENT
ID_STUDENT NUMBER PRIMARY KEY
Table STUDENT_COURSE
ID_STUDENT NUMBER REFERENCES STUDENT.ID_STUDENT
ID_COURSE NUMBER REFERENCES COURSE.ID_COURSE
COMPLETED CHAR(1) CHECK(IN('Y', 'N'))
PASSED CHAR(1) CHECK(IS NULL OR IN ('Y', 'N'))
Учитывая приведенный выше запрос, проверить, успешно ли студент прошел все курсовые работы, чтобы пройти данный класс, было бы проще.если запрос был написан для возврата предварительных курсов, которые студент НЕ ПРОБИЛ - что-то вроде
SELECT c.*
FROM STUDENT s
INNER JOIN COURSE STUDENT_COURSE sc
ON (sc.ID_STUDENT = s.ID_STUDENT)
LEFT OUTER JOIN PREREQUISITE_COURSE pc
ON (pc.ID_PREREQ_COURSE = sc.ID_COURSE)
INNER JOIN COURSE c
ON (c.ID_COURSE = pc.ID_COURSE)
WHERE s.ID_STUDENT = <id of student of interest> AND
c.ID_COURSE = <id of course of interest> AND
sc.COMPLETED = 'Y' AND
sc.PASSED = 'Y' AND
pc.ID_PREREQ_COURSE IS NULL
Обратите внимание, что это никак не проверялось и может содержать некоторые отвратительные логические ошибки (I 'я немного подозрительно отношусь к позднему соединению таблицы COURSE, например), но это должно быть полезно для начала.Или, цитируя философа Пратчетта
Не тестировали на животных - вы будете первым!
Делитесь и наслаждайтесь.