Однако иногда возникают ситуации, когда появляются проблемы с представлением в результате комбинации из 2-х допустимых предикатов, которые не будут работать. В качестве иллюстрации создадим представление, которое содержит данные о количестве студентов, получающих ту или иную стипендию:
AS SELECT STIP,COUNT (*)
GROUP BY STIP;
Теперь обратимся к этому представлению, чтобы выяснить, есть ли такой размер стипендии, который получен двумя студентами:
SELECT *
WHERE COL =2;
Если запрос к представлению преобразовать к запросу к исходной таблице, то, скорее всего, будет получено
SELECT STIP,COUNT(*)
WHERE COUNT(*)=2
Последний запрос недопустим, так как агрегатные функции не могут использоваться в предикате. Возникает закономерное предположение о то, что СУБД в некоторых случаях не может правильно сформулировать запрос к базовым таблицам, а значит выполнить его. Все зависит от того, каким образом и по каким алгоритмам система интерпретирует пользовательские команды. Правильным способом формирования приведенного выше запроса будет такой:
SELECT STIP,COUNT(*)
HAVING COUNT(*)=2;
Однако SQL может не выполнить такого превращения. В этом случае следует проверить, справляется ли используемая СУБД с аналогичными запросам, и в соответствии с этим формировать запросы к представлениям.
В SQL существует понятие групповых представлений, то есть таких, которые содержат предложение GROUP BY или которые основаны на других групповых представлениях. Предыдущий пример представления как раз относится к числу групповых представлений. Теперь каждый раз, когда требуется получить количество студентов, получающих ту или иную стипендию, достаточно просто выбрать все записи рассматриваемого представления вместо того, чтобы создавать достаточно сложный запрос.
Представления могут быть основаны на нескольких базовых таблицах. Например, создадим представление, которое показывало бы оценки студента по учебному предмету, причем содержало бы не коды, а полные названия.