问题:
写一个脚本,确定是否太少的学生(少于5)或太多的学生(超过10)在每门课程注册。为此,可以使用光标。此光标应使用 SELECT
获得 CourseID
每门课程的学生人数 StudentCourses
table。
当您在光标中的行中循环时,如果课程中注册的学生太少,脚本将显示如下消息:
“在课程x中注册的学生太少”,其中x是课程id。如果在课程中注册的学生太多,则脚本应显示类似的消息。
到目前为止我的代码是:
DECLARE Students_Cursor CURSOR FOR
SELECT c.CourseID, COUNT(sc.StudentID)
FROM Courses c
JOIN StudentCourses sc ON c.CourseID = sc.CourseID
WHERE COUNT(sc.StudentID) < 5 OR COUNT(sc.StudentID) > 10
OPEN Student_Cursor;
FETCH NEXT FROM Students_Cursor
WHILE @@FETCH_STATUS <> -1
BEGIN
IF
1条答案
按热度按时间a0zr77ik1#
使用光标通常比更好的替代选项慢。也就是说,您需要做的第一件事就是让select语句正常工作。我认为它不会像你现在这样管用。如果使用计数,则是聚合。如果要按聚合过滤结果,则不能使用where子句。相反,您需要将它移到having子句中。此外,由于您选择的计数多于聚合计数,因此需要按courseid分组。要继续此路线,您将有如下选择:
并不是说在游标中限制要运行的行数是个坏主意,但是如果要检查游标中的学生数,可能他们希望您在游标本身中执行逻辑。您只需删除having子句并遍历游标中的所有行即可。
一旦把select弄直,并从光标中提取,您就需要将所选的项拉入变量中,然后使用这些变量生成消息。因此,您希望更早地声明它们,然后将光标值拉入其中。像这样的
然后可以对@studentcount执行if/then条件,并在消息中使用@courseid。只需确保在那之后,您再次从begin/end块内的变量中获取next,然后当然关闭并释放游标。