Если студент обучается на курсах без предварительного условия, в результате выполнения запросов условий будет NULL. Итак, если курс имеет необходимое условие, и ученик взял предварительное условие, вы хотите, чтобы результат был таким же. Это облегчает последующую логику. Поэтому, если курс имеет необходимое условие, учащийся имеет , а не, результат будет идентификатором курса обязательного условия (вы можете использовать его для отображения значимого сообщения об ошибке).
Запрос возвращать NULL, если курс не имеет предпосылки легко:
select P.COURSE_PREREQUISITE Result
into RequiredReq
from Prerequisites P
where P.COURSE_NUMBER = :new.course_id;
Конечно, она возвращает курс идентификатор предпосылки, если есть один, но мы позаботимся о том, что позже , Теперь мы хотим, чтобы присоединиться к таблице STUDENTS_COURSES:
join STUDENTS_COURSES SC
on SC.COURSE_NUMBER = P.COURSE_PREREQUISITE
and SC.Student_ID = :new.Student_ID
Однако, это не будет давать нам все, что нам нужно. Во-первых, если ученик не взял необходимое условие, запрос ничего не вернет, поэтому мы получим ошибку NO_DATA_FOUND. Во-вторых, если у студента есть, взяв необходимое условие, он вернет идентификатор курса, но в этом случае мы хотим, чтобы он возвращал NULL.
Давайте посмотрим, что мы получим, если мы обратимся внутреннее соединение в левое внешнее соединение:
select P.COURSE_PREREQUISITE Result
into RequiredReq
from Prerequisites P
left join STUDENTS_COURSES SC
on SC.COURSE_NUMBER = P.COURSE_PREREQUISITE
and SC.Student_ID = :new.Student_ID
where P.COURSE_NUMBER = :new.course_id;
Это дает нам все, что мы хотим, но не совсем в правильном направлении. Мы получаем NULL, если необходимое условие имеет не, а обязательное значение, если оно имеет. Таким образом, чтобы изменить его вокруг, нам просто нужно немного логики в запросе:
select case when P.Prerequisite is null then null --> No prerequisite
when SC.StudentID is not null then null --> Prerequisite met
else P.Prerequisite end Result --> Prerequisite not met
into RequiredReq
from Prerequisites P
left join STUDENTS_COURSES SC
on SC.COURSE_NUMBER = P.COURSE_PREREQUISITE
and SC.Student_ID = :new.Student_ID
where P.COURSE_NUMBER = :new.course_id;
Теперь NULL означает, что либо курс не имеет предпосылки или студент выполнил предпосылку. Только если у курса есть необходимое условие: и ученик не выполнил, это возвращаемое значение, и это номер курса неудовлетворенного предпосылки.
Примечание: это работает только в том случае, если в ваших примерах есть только одно условие для каждого курса. Если может быть одно или несколько предварительных условий, вы, вероятно, захотите изменить числовые значения с 0, то есть не все или все встреченные предпосылки и ненулевые значения, что означает количество неудовлетворенных предварительных условий.
Итак, student_courses имеет всю историю студента? Пожалуйста, покажите схему COMPLETE. – OldProgrammer
Хорошо, но я не могу поместить схему сейчас, потому что у меня недостаточно репутации. –
просто покажите определение таблицы. – OldProgrammer