MS SQL Создать функцию, формирующую направления для студентов, не сдавших экзамены, к случайным преподавателям, ведущим эти дисциплины

Всех приветствую, стоит передо мной вот такая задачка: "Создать функцию, формирующую направления для студентов, не сдавших экзамены, к случайным преподавателям, ведущим эти дисциплины", имеются следующие таблицы:

Группы (Номер_Группы, Староста_Группы)

Студенты (Код_Студента, Фамилия, Имя, Отчество, Номер_Зачетной_Книжки, Номер_Группы, Домашний_Адрес, Телефон)

Дисциплины (Код_Дисциплины, Название, Количество_Часов, Описание)

Результаты_Сессии (Код_Студента, Код_Дисциплины, Дата, Вид_Контроля, Оценка)

Преподаватели (Код_Преподавателя, Фамилия, Имя, Отчество, Должность, Ученая_Степень, Дата_Приема_На_Работу, Номер_Кафедры)

Нагрузка (Код_Дисциплины, Код_Преподавателя)

Скриншот диаграммы: Диаграмма

Условия решение задачи: Нельзя использовать оконные функции, нельзя использовать CTE, задачка должна решаться элементарно, без слишком усложненных конструкций. Для рандома используется представление: CREATE VIEW dbo.Рандом AS SELECT NEWID() AS Рандомное_Значение; GO (Поскольку при создании функции нельзя использовать ORDER BY NEWID(), это что-то типо обхода)

Решения которые были забракованы:

  1. 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.Рандомное_значение)

Причина браковки: Используется оконная функция

  1. 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 шт):

Автор решения: rotabor

Подсказка: нужно собрать преподавателей по дисциплине, прицепив к каждому случайное значение, а потом отобрать одного с помощью MIN или MAX по этому случайному значению. А потом уже этого препода прицепить через Нагрузка к двойкам в Результаты_Сессии.

"T3.Код_Студента = T1.Код_Студента" нелогично потому, что T1 и T3 - это Результаты_Сессии.

→ Ссылка