Использование курсоров в Microsoft SQL Server с циклом - PullRequest
0 голосов
/ 07 августа 2020

Задача:

Напишите сценарий, определяющий, слишком ли мало студентов (менее пяти) или слишком много студентов (более 10) зачислены на каждый курс. Для этого вы можете использовать курсор. Этот курсор должен использовать оператор SELECT, который получает CourseID и количество студентов для каждого курса из таблицы StudentCourses.

Когда вы l oop через строк в курсоре, скрипт должен отобразить подобное сообщение, если на курс зачислено слишком мало студентов:

«Слишком мало студентов зачислено на курс x», где x - курс МНЕ БЫ. Скрипт должен отображать подобное сообщение, если на курс зачислено слишком много студентов.

Мой код на данный момент:

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 Ответ

0 голосов
/ 07 августа 2020

Использование КУРСОРА обычно медленнее, чем лучшие альтернативные варианты. При этом первое, над чем вам нужно будет поработать, - это заставить работать оператор 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;

Не то чтобы это плохая идея ограничивать количество строк, которые вы собираетесь пройти в КУРСОРЕ, но если вы собираетесь проверять количество студентов как часть КУРСОРА, возможно, они ищут вас, чтобы сделать logi c в самом КУРСОРЕ. Вместо этого вы можете просто исключить предложение HAVING и go во всех строках CURSOR.

После того, как вы выпрямите SELECT и вы FETCH из CURSOR, вы захотите вытащить элементы, которые вы SELECT в переменные, которые затем можно использовать для создания сообщений. Следовательно, вы хотите ОБЪЯВИТЬ их раньше, а затем вставить в них значения КУРСОРА. Что-то вроде

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

Затем вы можете выполнить условия IF / THEN на @StudentCount и использовать @CourseID в сообщении. Просто убедитесь, что после этого вы снова ВЫБИРАете NEXT FROM в переменные внутри блока BEGIN / END, затем, конечно, ЗАКРЫВАЕТЕ и ОТКЛЮЧАЕТ КУРСОР.

...