0 / 0 / 0
Регистрация: 09.08.2016
Сообщений: 2
1

Выбрать студентов, которые проходили все указанные курсы

09.08.2016, 19:57. Показов 1296. Ответов 3

Доброго времени суток! Столкнулся с следующей задачей: необходимо выбрать всех студентов, которые прошли все указанные курсы. Свои догадки написал ниже, но данный запрос выбирает и тех студентов, которые прошли хотя бы один из указанных.
SQL
1
2
3
4
SELECT student.Id, student.FirstName, student.LastName, student.MiddleName FROM student 
INNER JOIN coursegroupe AS cg ON cg.IdCourse IN ( '045d4fdd-83ac-45d5-9c7b-cd8e9ce85bf6','e2b59d3c-9c1e-44f5-aa9c-190ce8f063b2')
INNER JOIN groupestudent AS gs ON gs.IdGroupe = cg.Id
WHERE student.Id = gs.IdStudent;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2016, 19:57
Ответы с готовыми решениями:

Выбрать студентов, которые по результатам двух сессий имеют средний балл не ниже чем 4,5
Создать запись, в котором будет содержаться информация о студенте. Сведения должны включать:...

Как выбрать все записи которые повторяются по разным колонкам и как выбрать уникальные?
CREATE TABLE users ( name TEXT NOT NULL, city TEXT NOT NULL ); INSERT INTO users...

Найти и вывести фамилии тех студентов, которые все экзамены сдали на 9
Даны оценки группы студентов на экзаменах по 4 предметам: алгебре, геометрии, философии,...

Найти и вывести фамилии тех студентов, которые все экзамены сдали на 9
Даны оценки группы студентов на экзаменах по 4 предметам: алгебре, геометрии, философии,...

3
340 / 236 / 113
Регистрация: 12.05.2016
Сообщений: 642
09.08.2016, 23:24 2
Лучший ответ Сообщение было отмечено IVKLiMIV как решение

Решение

Если "влоб" то так (заодно дубликаты студентов уберёт):

SQL
1
2
3
4
5
6
7
8
9
SELECT * FROM student s
WHERE EXISTS(SELECT 1 FROM coursegroupe cg,groupestudent gs
             WHERE gs.IdStudent = s.Id
             AND   cg.Id = gs.IdGroupe
             AND   cg.IdCourse = '045d4fdd-83ac-45d5-9c7b-cd8e9ce85bf6')
AND EXISTS(SELECT 1 FROM coursegroupe cg,groupestudent gs
             WHERE gs.IdStudent = s.Id
             AND   cg.Id = gs.IdGroupe
             AND   cg.IdCourse = 'e2b59d3c-9c1e-44f5-aa9c-190ce8f063b2')
Добавлено через 6 минут
Или сначала подсчитываем, сколько раз каждый студент был на каждом из интересующих нас курсов, и потом отбираем тех, которые были на обоих хоть раз:

SQL
1
2
3
4
5
6
7
8
9
10
SELECT v.Id, v.FirstName, v.LastName, v.MiddleName FROM (
  SELECT s.Id, s.FirstName, s.LastName, s.MiddleName
  , SUM(CASE WHEN cg.IdCourse='045d4fdd-83ac-45d5-9c7b-cd8e9ce85bf6' THEN 1 ELSE 0 END) course1
  , SUM(CASE WHEN cg.IdCourse='e2b59d3c-9c1e-44f5-aa9c-190ce8f063b2' THEN 1 ELSE 0 END) course2
  FROM student s
  JOIN groupestudent gs ON gs.IdStudent = s.Id
  JOIN coursegroupe cg  ON cg.Id = gs.IdGroupe
  GROUP BY s.Id, s.FirstName, s.LastName, s.MiddleName
) v
WHERE v.course1 > 0 AND v.course2 > 0
1
0 / 0 / 0
Регистрация: 09.08.2016
Сообщений: 2
10.08.2016, 11:02  [ТС] 3
Мне подсказали более проще вариант
SQL
1
2
3
4
5
6
SELECT student.Id, student.FirstName, student.LastName, student.MiddleName FROM student 
INNER JOIN coursegroupe AS cg ON cg.IdCourse IN ( '045d4fdd-83ac-45d5-9c7b-cd8e9ce85bf6','e2b59d3c-9c1e-44f5-aa9c-190ce8f063b2')
INNER JOIN groupestudent AS gs ON gs.IdGroupe = cg.Id
WHERE student.Id = gs.IdStudent;
GROUP BY student.id
HAVING COUNT(cg.idCourse)=2
0
340 / 236 / 113
Регистрация: 12.05.2016
Сообщений: 642
10.08.2016, 11:27 4
Этот вариант не работает, если группа может посетить один курс два раза.
Хотя, если такой вариант исключен административно - то да, можно и так.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.08.2016, 11:27
Помогаю со студенческими работами здесь

Вывести сведения на экран и распечатать процент студентов, которые сдали все экзамены на 5 и 4
Есть сведения о том, как завершилась зимняя сессия на 4 курсе. Сведения о каждом студенте (всего...

Вывести анкетные данные студентов, которые получили за последнюю сессию все оценки 5
4. В группе 5 человек. Вывести анкетные данные студентов, которые получили за последнюю сессию все...

выбрать все те месяца которые имеют 31 день
Есть программа.. Задача в том, чтобы выбрать все те месяца которые имеют 31 день. program ffd;...

Выбрать все элементы с именами которые присутствуют в allowed
Всем привет. Есть список объектов var currentList = new List<SymbolsTable>(); public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru