Ответы к некоторым упражнениям

8.1. Проблема здесь состоит в том, каким образом должно быть определено поле SP.КОЛИЧЕСТВО? Разумным представляется следующий ответ: для данной пары (НОМЕР_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ) SP.КОЛИЧЕСТВО должно быть суммой всех значений SPJ. КОЛИЧЕСТВО, взятых по всем значениям поля НОМЕР_ИЗДЕЛИЯ для рассматриваемой пары (НОМЕР_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ).

CREATE VIEW SP (НОМЕР_ПОСТАВЩИКА,НОМЕР_ДЕТАЛИ,

КОЛИЧЕСТВО)

AS SELECT НОМЕР_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ,

SUM (КОЛИЧЕСТВО)

FROM SPJ

GROUP BY НОМЕР_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ;

8.2. CREATE VIEW JC (НОМЕР_ИЗДЕЛИЯ, ГОРОД)

AS SELECT DISTINCT J. НОМЕР_ИЗДЕЛИЯ. J.ГОРОД

FROM J,SPJ

WHERE J.НОМЕР_ИЗДЕЛИЯ = SPJ.НОМЕР_ИЗДЕЛИЯ

AND (SP J. НОМЕР_ПОСТАВЩИКА ='S1' OR

SP J. НОМЕР_ДЕТАЛИ = 'PI');

8.3. Определенное в ответе на упражнение 8.2 представление необновляемо, поскольку во фразе FROM в его определении указывается несколько таблиц. Поэтому:

б) Обновляемая версия:

CREATE VIEW JC (НОМЕР_ИЗДЕЛИЯ, ГОРОД)

AS SELECT J. НОМЕР_ИЗДЕЛИЯ, J.ГОPOД

FROM J. НОМЕР_ИЗДЕЛИЯ IN

(SELECT НОМЕР_ИЗДЕЛИЯ

FROM SPJ

WHERE НОМЕР_ПОСТАВЩИКА = 'S1')

AND J. НОМЕР_ИЗДЕЛИЯ IN

(SELECT НОМЕР_ИЗДЕЛИЯ

FROM SPJ

WHERE НОМЕР_ ДЕТАЛИ = 'Р1');

Теперь повторите упражнение.

а) Нет.

8.4. CREATE VIEW НЕ_СОРАЗМЕЩЕННЫЕ

AS SELECT НОМЕР_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ

FROM S, Р

WHERE S. ГОРОД Ø = Р. ГОРОД;

8.5. CREATE VIEW ЛОНДОНСКИЕ_ПОСТАВЩИКИ

AS SELECT НОМЕР_ПОСТАВЩИКА,ФАМИЛИЯ, СОСТОЯНИЕ

FROM S

WHERE ГОРОД = 'Лондон';

В представлении опущен столбец ГОРОД, поскольку известно, что его значение для каждой видимой через это представление строки должно быть 'Лондон'. Заметим, однако, что это опущение означает, что любая вставляемая (с помощью операции INSERT) через это представление запись будет немедленно исчезать, поскольку ее поле ГОРОД значение будет принимать неопределенное значение.

8.6 Корректны только операции а), б) и г). В частности, отметим, что операция ж) некорректна, так как представление, определение которого включает фразу GROUP BY, не может соединяться с другими таблицами. Приведем эквивалент, полученный в результате трансляции, только для случая г):

SELECT MAX (КОЛИЧЕСТВО) - MI N (КОЛИЧЕСТВО),

НОМЕР_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ

FROM SPJ

WHERE НОМЕР_ПОСТАВЩИКА ='S1'

AND НОМЕР_ДЕТАЛИ = 'Р1’

GROUP BY НОМЕР_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ

HAVING SUM (КОЛИЧЕСТВО)> 50;


ГЛАВА 9

БЕЗОПАСНОСТЬ И САНКЦИОНИРОВАНИЕ ДОСТУПА


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: