SQL-запрос для получения инструкторов и студентов имеет неверный идентификатор - PullRequest
0 голосов
/ 25 февраля 2019

Привет У меня есть схема, которая выглядит следующим образом

Image of the schema

Я сделал два запроса, которые должны были сделать это:

  1. Найтиимена лучших 4 инструкторов, которые преподавали наибольшее количество различных курсов.Показать также общее количество преподаваемых курсов.

    • Выходные столбцы: InstructorName, NumberOfCoursesTaught
    • Сортировать по: NumberOfCoursesTaught в порядке убывания
  2. Найдите 2 лучших студентов, которые прошли наибольшее количество курсов.

    • Выходные столбцы: S_ID, StudentName, NumberOfCourses

    • Сортировать по: NumberOfCourses в порядке убывания

Для запроса 1 я написал:

SELECT name AS InstructorName, count(course_id) AS NumberOfCourses
FROM Teaches 
WHERE name IN (SELECT name FROM Instructor where Instructor.i_id = Teaches.i_id)
GROUP BU i_id
ORDER BY COUNT(course_id) DESC;

Для запроса 2 я написал

SELECT s_id as S_ID, name as StudentName, count(course_id) as NumberOfCourses
FROM Takes 
WHERE name IN (SELECT name FROM Student WHERE Takes.s_id = Student.s_id)
GROUP BY s_id
ORDER BY COUNT(course_id) DESC;

Оба говорят:

"ИМЯ" Неверный идентификатор

1 Ответ

0 голосов
/ 25 февраля 2019

Я предлагаю вам использовать другую логику для построения ваших запросов.Вот демонстрация для первого запроса;После этого вы сможете создать второй запрос (и, возможно, опубликовать его как ответ?).


Начните с составного запроса, который вычисляет количество учителей на идентификатор инструктора, глядя натаблица Teaches:

SELECT i_id, COUNT(*) cnt FROM Teaches GROUP BY i_id

Затем ранжируйте каждую запись по убыванию количества, используя оконную функцию ROW_NUMBER():

SELECT i_id, cnt, ROW_NUMBER() OVER(ORDER BY cnt DESC) rn
FROM (SELECT i_id, COUNT(*) cnt FROM Teaches GROUP BY i_id) t

Все, что осталось сделать, - это получить имя инструктора(JOIN ON Instructor) и отфильтруйте в верхних 4 записях

SELECT i.name InstructorName, x.cnt NumberOfCoursesTaught
FROM (
    SELECT i_id, cnt, ROW_NUMBER() OVER(ORDER BY cnt DESC) rn
    FROM (SELECT i_id, COUNT(*) cnt FROM Teaches GROUP BY i_id) t
) x
INNER JOIN Instructor i ON i.i_id = x.i_id
WHERE x.rn <= 4
ORDER BY x.cnt desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...