Примечание: мое исследование показало этот вопрос , который дает возможное решение моей проблемы, но мой вопрос носит более общий характер: такое решение я должен выбрать?
Я хотел бы запросить базу данных по академической истории, чтобы дать мне запись по каждой паре классов исчисления, взятых конкретным студентом, где один является предпосылкой другого. Если база данных была настроена правильно или нумерация курса была разумной, я мог бы сделать:
SELECT ...
FROM Academic_History PrerequisiteCourse
JOIN Academic_History NextCourse
ON (NextCourse.CalculusLevel = PrerequisiteCourse.CalculusLevel + 1)
WHERE ...
Конечно, поле CalculusLevel не существует, так что это чепуха. Кроме того, есть несколько номеров курсов, которые подпадают под исчисление I, и несколько номеров, которые подпадают под исчисление II и т. Д., И они меняются довольно часто. Это делает жесткое кодирование всех необходимых пар в оператор JOIN, как эта, действительно плохой идеей:
SELECT ...
FROM Academic_History PrerequisiteCourse
JOIN Academic_History NextCourse
ON (NextCourse.CourseNumber = '231' AND PrerequisiteCourse.CourseNumber = '220'
OR NextCourse.CourseNumber = '231' AND PrerequisiteCourse.CourseNumber = '221'
OR NextCourse.CourseNumber = '241' AND PrerequisiteCourse.CourseNumber = '231'
OR NextCourse.CourseNumber = '24-' AND PrerequisiteCourse.CourseNumber = '231'
...)
WHERE ...
То, что я чувствую, что я должен сделать, это создать поле "CalculusLevel" на лету, которое было бы намного проще поддерживать:
SELECT CASE PrerequisiteCourse.CRS_NBR
WHEN '115' THEN '0'
WHEN '220' THEN '1'
WHEN '221' THEN '1'
...
END PrerequisiteCourseLevel,
CASE NextCourse.CRS_NBR
WHEN '115' THEN '0'
WHEN '220' THEN '1'
WHEN '221' THEN '1'
...
END NextCourseLevel,
FROM Academic_History PrerequisiteCourse
JOIN Academic_History NextCourse
ON (PrerequisiteCourseLevel + 1 = NextCourseLevel)
WHERE ...
Но, конечно, объединение не работает, поскольку эти столбцы отсутствуют в этих таблицах. Тем не менее, даже если я переместил условие из JOIN ON
в предложение WHERE
, я получаю ошибку "Invalid Identifier", возможно, потому что эти поля еще не существуют, когда выполняется предложение WHERE.
Какой правильный способ сделать это? Я придумал пару решений, таких как упомянутое во втором блоке кода, но все они кажутся непрофессиональными взломами.
Спасибо!