在我在SELECT语句中创建的列上进行联接时,“无效标识符”

|| 注意:我的研究提出了这个问题,这为我的问题提供了可能的解决方案,但是我的问题更笼统:我应该寻求哪种解决方案? 我想查询一个学术历史数据库,以便为我记录一个特定学生参加的每对微积分课程,其中一个是另一个的先决条件。如果数据库设置良好或课程编号合理,我可以这样做:
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 ...
但是,当然,联接不起作用,因为这些列不在这些表中。但是,即使将条件从ѭ3移出并移到
WHERE
子句中,我也会收到\“ Invalid Identifier \”错误,大概是因为执行WHERE子句时这些字段尚不存在。 什么是正确的方法?我已经提出了几个解决方案,就像我在第二个代码块中提到的那样,但是它们都感觉像是非专业的黑客。 谢谢!     
已邀请:
        您可以使用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
    

要回复问题请先登录注册