在我在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子句时这些字段尚不存在。
什么是正确的方法?我已经提出了几个解决方案,就像我在第二个代码块中提到的那样,但是它们都感觉像是非专业的黑客。
谢谢!
没有找到相关结果
已邀请:
1 个回复
襄挟款籍
编辑:根据您的评论,您可以通过扩展
语句的位置来重构它: