在microsoft sql server中使用带循环的游标

9lowa7mx  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(492)

问题:
写一个脚本,确定是否太少的学生(少于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
a0zr77ik

a0zr77ik1#

使用光标通常比更好的替代选项慢。也就是说,您需要做的第一件事就是让select语句正常工作。我认为它不会像你现在这样管用。如果使用计数,则是聚合。如果要按聚合过滤结果,则不能使用where子句。相反,您需要将它移到having子句中。此外,由于您选择的计数多于聚合计数,因此需要按courseid分组。要继续此路线,您将有如下选择:

SELECT c.CourseID, COUNT(sc.StudentID) FROM Courses c JOIN StudentCourses sc
ON c.CourseID= sc.CourseID
GROUP BY c.CourseID
HAVING COUNT(sc.StudentID) < 5  OR COUNT(sc.StudentID) > 10;

并不是说在游标中限制要运行的行数是个坏主意,但是如果要检查游标中的学生数,可能他们希望您在游标本身中执行逻辑。您只需删除having子句并遍历游标中的所有行即可。
一旦把select弄直,并从光标中提取,您就需要将所选的项拉入变量中,然后使用这些变量生成消息。因此,您希望更早地声明它们,然后将光标值拉入其中。像这样的

FETCH NEXT FROM Students_Cursor INTO @CourseID, @StudentCount;
WHILE @@FETCH_STATUS <> -1

然后可以对@studentcount执行if/then条件,并在消息中使用@courseid。只需确保在那之后,您再次从begin/end块内的变量中获取next,然后当然关闭并释放游标。

相关问题