Операции выборки

В разделе 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.


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



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