【问题标题】:Using cursors in Microsoft SQL Server with a loop在 Microsoft SQL Server 中使用带有循环的游标
【发布时间】:2020-11-27 06:41:55
【问题描述】:

问题:

编写一个脚本,确定每门课程注册的学生是否太少(少于 5 名)或太多(超过 10 名)。为此,您可以使用光标。此游标应使用SELECT 语句,该语句从StudentCourses 表中获取CourseID 和每门课程的学生人数。

当您遍历光标中的行时,如果参加课程的学生太少,脚本应该显示如下消息:

“参加课程 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 

【问题讨论】:

  • 您使用的是哪种类型的 SQL(SQL Server、Oracle、MySQL,...)?请适当地标记您的问题。
  • 我正在使用 Microsoft Sql Server
  • 不需要光标。必须使用光标吗?
  • @MundoPeter 是的,它说使用光标的问题
  • @Wellbl2 你的作业问题是说你“可以”使用光标,而不是“必须”使用光标。

标签: sql sql-server loops variables cursors


【解决方案1】:

使用 CURSOR 通常比更好的替代选项慢。话虽如此,您需要做的第一件事就是让 SELECT 语句正常工作。我不认为它会像你一样工作。如果您使用的是 COUNT,则表示您正在聚合。如果要按聚合过滤结果,则不能使用 WHERE 子句来执行此操作。相反,您需要将其移动到 HAVING 子句中。此外,由于您选择的数量超过了总数量,因此您需要按 CourseID 进行分组。要继续这条路线,您将有一个类似的 SELECT:

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;

并不是说限制要在 CURSOR 中运行的行数是一个坏主意,但是如果您要检查学生的数量作为 CURSOR 的一部分,也许他们正在寻找您在 CURSOR 本身中执行逻辑。您可以直接删除 HAVING 子句,而是遍历 CURSOR 中的所有行。

一旦您理顺了 SELECT 并从 CURSOR 中提取,您希望将您选择的项目拉入变量中,然后您可以使用这些变量来生成您的消息。因此,您希望更早地声明它们,然后将 CURSOR 值拉入其中。类似的东西

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

然后您可以对@StudentCount 执行IF/THEN 条件,并在消息中使用@CourseID。只需确保在那之后,您再次在 BEGIN/END 块内将 NEXT FROM 提取到变量中,然后当然是 CLOSE 和 DEALLOCATE CURSOR。

【讨论】:

  • 不客气。如果它回答了您的问题,请接受答案为已接受(单击答案旁边的复选标记,将其从灰色切换为已填充)。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 2018-01-12
  • 2017-06-29
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 2013-03-25
相关资源
最近更新 更多