2.1. Подсчитать количество поставщиков, которые обеспечивают данный проект:
SELECT count(*)
FROM Поставщики
WHERE Поставщики.Номер_поставщика IN
(SELECT Поставки.Номер_поставщика FROM Поставки,Проекты WHERE Проекты.Номер_проекта=Поставки.Номер_проекта AND Проекты.Наименование="< Наименование_проекта >" );
Данную задачу можно выполнить только с использованием вложенных запросов. Здесь внутренний запрос получает множество номеров поставщиков, обеспечивающих определенный проект. При этом в результате внутреннего запроса номера поставщиков могут дублироваться, так как один и тот же поставщик может осуществлять несколько поставок для одного и того же проекта. В задании же необходимо подсчитать количество различных поставщиков. Для этого внешний запрос выбирает из таблицы «Поставщики» номера только тех поставщиков, которые входят во множество, получаемое внутренним запросом. Принадлежность к множеству проверяется при помощи предиката IN. Количество выбранных номеров подсчитывается при помощи агрегатной функции count(*).
2.2. В предыдущем запросе результат внутреннего запроса являлся результатом условного соединения таблиц «Поставки» и «Проекты». Для выполнения той же операции можно воспользоваться специальным выражением IINNER JOIN.
SELECT count(*)
FROM Поставщики
WHERE Поставщики.Номер_поставщика IN
(SELECT Поставки.Номер_поставщика FROM Поставки INNER JOIN Проекты ON ( Проекты.Номер_проекта=Поставки.Номер_проекта AND Проекты.Наименование="< Наименование_проекта >" ));
2.3.На основе предыдущего запроса несложно написать запрос, который будет выводить информацию о количестве поставщиков для всех проектов.
SELECT P.Наименование, Count(*)
FROM Проекты AS P, Поставщики
WHERE Поставщики.Номер_поставщика IN
(SELECT Поставки.Номер_поставщика FROM Поставки,Проекты AS Projects WHERE ( Projects.Номер_проекта=Поставки.Номер_проекта AND Projects.Наименование = P.Наименование ))
GROUP BY P.Наименование;
Внешний запрос создает декартово произведение таблиц «Проекты» и «Поставщики», из которого по полю «Номер_поставщика» при помощи внутреннего запроса отбираются только те пары Проект-Поставщик, для которых существует запись в таблице «Поставки» с соответствующим номером поставщика.
2.4.Аналогично можно подсчитать количество различных используемых деталей для каждого проекта:
SELECT P.Наименование, Count(*)
FROM Проекты AS P, Детали
WHERE Детали.Номер_детали IN
(SELECT Поставки.Номер_детали FROM Поставки, Проекты AS Projects WHERE ( Projects.Номер_проекта = Поставки.Номер_проекта AND Projects.Наименование = P.Наименование ))
GROUP BY P.Наименование;