«Неверный идентификатор» при присоединении к столбцу, который я создал в инструкции SELECT - PullRequest
1 голос
/ 24 июня 2011

Примечание: мое исследование показало этот вопрос , который дает возможное решение моей проблемы, но мой вопрос носит более общий характер: такое решение я должен выбрать?

Я хотел бы запросить базу данных по академической истории, чтобы дать мне запись по каждой паре классов исчисления, взятых конкретным студентом, где один является предпосылкой другого. Если база данных была настроена правильно или нумерация курса была разумной, я мог бы сделать:

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.

Какой правильный способ сделать это? Я придумал пару решений, таких как упомянутое во втором блоке кода, но все они кажутся непрофессиональными взломами.

Спасибо!

1 Ответ

2 голосов
/ 24 июня 2011

Вы можете добавить многократно используемые столбцы, используя CTE:

;with   hist as
        (
        select  case ... end as NextCourseLevel
        ,       case ... end as PrerequisiteCourseLevel
        ,       *
        from    Academic_History
        )
select  *
from    hist t1
join    hist t2
on      t1.PrerequisiteCourseLevel + 1 = t2.NextCourseLevel

РЕДАКТИРОВАТЬ: В своем комментарии вы можете реорганизовать оператор with, расширив его везде, где он используется:

select  *
from    (
        select  case ... end as PrerequisiteCourseLevel
        ,       *
        from    Academic_History
        ) as t1
join    (
        select  case ... end as NextCourseLevel
        ,       *
        from    Academic_History
        ) as t2
on      t1.PrerequisiteCourseLevel + 1 = t2.NextCourseLevel
...