MS SQL Создать функцию, формирующую направления для студентов, не сдавших экзамены, к случайным преподавателям, ведущим эти дисциплины
Всех приветствую, стоит передо мной вот такая задачка: "Создать функцию, формирующую направления для студентов, не сдавших экзамены, к случайным преподавателям, ведущим эти дисциплины", имеются следующие таблицы:
Группы (Номер_Группы, Староста_Группы)
Студенты (Код_Студента, Фамилия, Имя, Отчество, Номер_Зачетной_Книжки, Номер_Группы, Домашний_Адрес, Телефон)
Дисциплины (Код_Дисциплины, Название, Количество_Часов, Описание)
Результаты_Сессии (Код_Студента, Код_Дисциплины, Дата, Вид_Контроля, Оценка)
Преподаватели (Код_Преподавателя, Фамилия, Имя, Отчество, Должность, Ученая_Степень, Дата_Приема_На_Работу, Номер_Кафедры)
Нагрузка (Код_Дисциплины, Код_Преподавателя)
Условия решение задачи:
Нельзя использовать оконные функции, нельзя использовать CTE, задачка должна решаться элементарно, без слишком усложненных конструкций.
Для рандома используется представление:
CREATE VIEW dbo.Рандом AS SELECT NEWID() AS Рандомное_Значение; GO
(Поскольку при создании функции нельзя использовать ORDER BY NEWID(), это что-то типо обхода)
Решения которые были забракованы:
SELECT
s.Код_Студента,
s.Фамилия,
s.Имя,
s.Отчество,
s.Номер_Группы,
r.Код_Дисциплины,
p.Код_Преподавателя,
p.Фамилия AS Преподаватель_Фамилия,
p.Имя AS Преподаватель_Имя
FROM
Студенты s
JOIN Результаты_Сессии r ON s.Код_Студента = r.Код_Студента
JOIN Нагрузка n ON r.Код_Дисциплины = n.Код_Дисциплины
JOIN Преподаватели p ON n.Код_Преподавателя = p.Код_Преподавателя
CROSS JOIN Рандом as rnd
WHERE
r.Вид_Контроля = 'Экзамен'
AND r.Оценка < 3
ORDER BY ROW_NUMBER() OVER (PARTITION BY s.Код_Студента ORDER BY rnd.Рандомное_значение)
Причина браковки: Используется оконная функция
SELECT T1.*,
(
SELECT Код_Преподавателя FROM
(
SELECT TOP 1 T2.Код_Преподавателя, (SELECT Рандомное_Значение FROM Рандом) as rnd
FROM Нагрузка AS T2
JOIN Результаты_Сессии AS T3 ON T2.Код_Дисциплины = T3.Код_Дисциплины
WHERE T3.Код_Студента = T1.Код_Студента AND T2.Код_Дисциплины = T1.Код_Дисциплины
ORDER BY rnd
) AS Случайный_преподователь
) AS Код_Преподавателя
FROM
Результаты_Сессии AS T1
WHERE T1.Вид_Контроля = 'Экзамен' AND T1.Оценка <= 2;
Причина браковки: По словам преподавателя данное решение является нелогичным, а именно T3.Код_Студента = T1.Код_Студента это условие делает запрос нелогичным. Но без него рандом начинает работать криво и преподаватели рандомятся по дисциплинам

Если не убирать условие T3.Код_Студента = T1.Код_Студента, то рандом начинает работать правильно

Прошу вас помочь с решением и объяснением
Ответы (1 шт):
Подсказка: нужно собрать преподавателей по дисциплине, прицепив к каждому случайное значение, а потом отобрать одного с помощью MIN или MAX по этому случайному значению. А потом уже этого препода прицепить через Нагрузка к двойкам в Результаты_Сессии.
"T3.Код_Студента = T1.Код_Студента" нелогично потому, что T1 и T3 - это Результаты_Сессии.
