![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
(SELECT DISTINCT ОТВ.Nкф FROM ОТВ, ДЦ
WHERE ДЦ.Цикл="ЕН" and ОТВ.Nдц=ДЦ.Nдц)
Разберем теперь задачи, в которых требуется сравнить два множества, на примере задачи 15.
Задача 15. Дать фамилии старост групп обучающихся только по типовым учебным планам.
Для понимания сути этой задачи построим для нее аналог схемы 3 для задачи 14 (стр.34)
Типы объектов и связей (стрелка показывает начало рассуждений) | ДИСЦИПЛИНА | ВЫБИРАЕТ | ![]() | ПРЕДС-ТАВЛЯЕТ | ГРУППА | ВХОДИТ | ПОТОК | ИЗУЧАЕТ | ДИСЦИПЛИНА |
Первичные ключи типов объектов | Nдц Nдц | ![]() | Кст | ![]() | Nгр | ![]() | Nпт | ![]() | Nдц Nдц |
Ограничения на множества | Только старосты | ||||||||
Условие на множества | М1(Nдц) | Ì | М2(Nдц) | ||||||
Схема 4. Преобразование текста задачи 15 в цепочки связей |
Отличие этой схемы состоит в том, что связь УЧИТСЯ_В заменена связью ПРЕДСТАВЛЯЕТ и, если раньше М2 должно было быть подмножеством М1, то теперь условие вложения множеств должно быть обратным: М1 Ì М2. Как уже отмечалось ранее, решение задачи состоит в том, чтобы отобрать тех старост групп, для которых не существует разность двух множеств: множества дисциплин, изучаемых потоком, в котором он учится и множества дисциплин, выбранных им для изучения. Таким образом, в основной части запроса мы перебираем всех старост групп, а в условии запроса проверяем отсутствие кортежей в разности М1 – М2.
SELECT СТ.Фио
FROM СТ, ГР
WHERE СТ.Кст = ГР.Кстг
and NOT EXISTS (SELECT ВЫБ.Nдц FROM ВЫБ
WHERE ВЫБ.Кст = СТ.Кст
MINUS
SELECT ИЗЧ Nдц FROM ИЗЧ
WHERE ИЗЧ.Nпт = ГР.Nпт)
Интересно рассмотреть решение на SQL следующей задачи.
Задача 17. Номера групп, все студенты которых изучают одни и те же дисциплины.
Более понятно как решить эту задачу, если высказать ее в следующем виде: выдать номера тех групп, в которых не существует ни одного студента, для которого множество изучаемых им дисциплин, отличается от множества дисциплин, изучаемых любым другим студентом. Выберем любого студента группы (например, старосту) и будем сравнивать множество изучаемых им дисциплин с множеством дисциплин, изучаемых всеми остальными студентами этой группы на эквивалентность. Так как сравнения на эквивалентность двух множеств нет, то придется анализировать на отсутствие кортежей обе разности множеств. Как только обнаружится студент, для которого это условие не выполнено, номер этой группы нас не интересует, и все вычисления повторяются для следующей группы. На SQL это выглядит так.
SELECT ГР.Nгр
FROM ГР
Дата публикования: 2015-10-09; Прочитано: 310 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!