4.5. Решение упр.3.
Основная задача
Получить список номеров поставщиков, поставивших для одного и того же изделия все детали , изготавливаемые в городе, в котором не проживают поставщики с минимальным и максимальным рейтингом.Анализ задачи.
В каждом городе изготавливается некоторое множество деталей. Мы должны включить поставщика в результирующий список, если для него найдется город такой, что:- данный поставщик поставляет каждую деталь из множества деталей, изготавливаемых в этом городе, для какого-то одного (все равно какого) изделия (или иначе, найдется изделие такое, что нет детали, которая изготавливается в этом городе, но не поставляется данным поставщиком для данного изделия).
- в этом городе не проживают поставщики с минимальным и максимальным рейтингом.
- в этом городе производится хотя бы одна деталь.
Визуальный анализ данных
Попытаемся проанализировать данные и определить ожидаемый результат. Прежде всего, посмотрим
в каких городах изготавливаются детали select distinct town from p Получаем Лондон Париж Рим |
в каких городах проживают поставщики с минимальным и максимальным рейтингом select * from s order by rg Получаем S2 Джонс 10 Париж S1 Смит 20 Лондон S4 Кларк 20 Лондон S3 Блейк 30 Париж S5 Адамс 30 Афины |
в Лондоне |
в Риме |
||||||
|
|
все три детали P1, P4, P6 для какого-то одного изделия | или |
деталь P3 для какого-нибудь изделия |
||||||||||||||||||||||||||||||||
|
|
Объединив результаты, получаем, что наш ненаписанный запрос должен вернуть поставщиков S2, S3, S5
Теперь выделим подзадачи.
Подзадача 1.
Первая подзадача очевидна - получение списка номеров поставщиков.Select a.n_post from a s |
Теперь реализуем условие отбора.
Подзадача 2.
Определим города, где изготавливаются деталиselect distinct town from p |
Далее определим города, где проживают поставщики с минимальным и максимальным рейтингом. Перед этим нужно найти собственно минимальный и максимальный рейтинг. Таким образом
Подзадача 3.
Определить максимальный рейтинг select max(b.rg) from s b |
Подзадача 4.
Определить минимальный рейтинг
select min(c.rg) from s c |
Подзадача 5.
Получить список городов, где проживают поставщики с минимальным и максимальным рейтингом select distinct d.town from s d where d.rg=(select min(b.rg) from s b) or d.rg=(select max(c.rg) from s c) |
Подзадача 6.
Используя решение подзадач 2 и 5, получим список городов, где производятся детали, но не проживают поставщики с минимальным и максимальным рейтингом. Для этого используем оператор Except (исключение), который возвращает записи входящие в первый select и не входящие во второй.select distinct town from p Except select distinct d.town from s d where d.rg=(select min(b.rg) from s b) or d.rg=(select max(c.rg) from s c) |
Подзадача 7.
Получим перечень деталей, производимых в каком-либо городе (например, в Лондоне) и не поставляемых некоторым поставщиком (например, S2) для некоторого изделия (например, J1)select n_det from p where p.n_det in (select p1.n_det from p p1 where p1.town='Лондон') and not p.n_det in (select distinct spj.n_det from spj where spj.n_post='S2' and spj.n_izd='J1') |
Подзадача 8.
Получим перечень изделий, для которых запрос из подзадачи 7 будет пустым. Иначе получим перечень изделий, для которых поставщик S2, поставляет все детали изготавливаемые в Лондоне.Select j.n_izd from j where not exists( select n_det from p where p.n_det in (select p1.n_det from p p1 where p1.town='Лондон') and not p.n_det in (select distinct spj.n_det from spj where spj.n_post='S2' and spj.n_izd=j.n_izd)) |
Подзадача 9.
Получим перечень городов, для которых запрос из подзадачи 8 будет непустым. Иначе получим перечень городов, для которых поставщик S2, поставляет все детали изготавливаемые в городе для некоторого изделия.Select tw.town from p tw where exists (Select j.n_izd from j where not exists (Select n_det from p where p.n_det in (select p1.n_det from p p1 where p1.town=tw.town ) and not p.n_det in (select distinct spj.n_det from spj where spj.n_post=='S2' and spj.n_izd=j.n_izd) ) ) |
Подзадача 10.
Получим перечень поставщиков, для которых запрос из подзадачи 9 будет непустым. Иначе получим перечень поставщиков, поставивших для одного и того же изделия все детали , изготавливаемые в (пока что) любом городе.Select s.n_post from s where exists (Select tw.town from p tw where exists (Select j.n_izd from j where not exists (Select n_det from p where p.n_det in (select p1.n_det from p p1 where p1.town=tw.town ) and not p.n_det in (select distinct spj.n_det from spj where spj.n_post=s.n_post and spj.n_izd=j.n_izd) ) ) ) |