РУКОВОДСТВО ПО РЕЛЯЦИОННОЙ СУБД DB2

         

ОПЕРАЦИИ ВЫБОРКИ


В разделе 8.1 уже было показано в общих чертах, каким образом операции выборки данных над представлением преобразуются в эквивалентные операции над лежащей в его основе базовой таблицей (или базовыми таблицами). Обычно этот процесс преобразования совершенно ясен и осуществляется вполне хорошо, без каких-либо неожиданностей для пользователя. Однако иногда такие неожиданности могут иметь место. Так, могут возникнуть проблемы, если пользователь пытается интерпретировать поле представления как обычное поле, а это поле представления продуцируется из чего-либо иного, чем простое поле лежащей в основе базовой таблицы. Например, оно может продуцироваться с помощью стандартной функции. Рассмотрим следующий пример определения представления:

CREATE               VIEW              PQ (НОМЕР_ДЕТАЛИ, ОБЩЕЕ_КОЛИЧЕСТВО)

AS                   SELECT           НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО)

FROM              SP

GROUP           BY                  НОМЕР_ДЕТАЛИ;

Это представление — «статистическая сводка» из раздела 8.2, пример 2.

Предпринятый запрос:

SELECT    *

FROM       PQ

WHERE    ОБЩЕЕ_КОЛИЧЕСТВО > 500;

Если применить простой процесс слияния, описанный в разделе 8.1, для того, чтобы скомбинировать этот запрос с определением представления, хранимым в каталоге, мы получим нечто подобное следующему:

SELECT    НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО)

FROM       SP



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

GROUP    BY НОМЕР_ДЕТАЛИ;

Такое предложение

SELECT недопустимо. Не разрешается, чтобы в предикате во фразе WHERE использовалась стандартная функция, например SUM. Первоначальный запрос следовало бы на самом деле преобразовать в нечто подобное следующему:

SELECT    НОМЕР_ДЕТАЛИ, SUM (КОЛИЧЕСТВО)

FROM       SP

GROUP    BY НОМЕР_ДЕТАЛИ

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

Однако система DB2 не умеет выполнять такое преобразование.

Ниже приводится другой пример, в котором рассматриваемое преобразование снова не работает. В этом примере опять используется представление — статистическая сводка PQ. Предпринимаемый запрос:

SELECT    AVG (ОБЩЕЕ_КОЛИЧЕСТВО)

FROM       PQ;

«Преобразованная» форма:

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

FROM       SP

GROUP    BY НОМЕР_ДЕТАЛИ;

И снова это недопустимое предложение. В языке SQL не разрешается использовать вложенные таким образом стандартные функции.

Общий принцип, который нарушается в этих двух примерах, таков: преобразованная форма первоначального запроса всегда должна быть допустимым предложением SELECT языка SQL.



Содержание раздела