КОМБИНИРОВАНИЕ ПРЕДИКАТОВ ПРЕДСТАВЛЕНИЙ И ОСНОВНЫХ ЗАПРОСОВ В ПРЕДСТАВЛЕНИЯХ
Когда вы делаете запрос представления, вы
собственно, запрашиваете запрос. Основной способ для SQL обойти это, - объединить предикаты
двух запросов в один.
Давайте посмотрим еще раз на наше представление с именем Londonstaff :
CREATE VIEW Londonstaff AS SELECT * FROM Salespeople WHERE city = 'London';
Если мы выполняем следующий запрос в этом представлении
SELECT * FROM Londonstaff WHERE comm > .12;
он такой же как если бы мы выполнили следующее в таблице Продавцов:
SELECT * FROM Salespeople WHERE city = 'London' AND comm > .12;
Это прекрасно, за исключением того, что появляется возможная проблема с
представлением. Имеется возможность комбинации из двух полностью допустимых предикатов и
получения предиката
который не будет работать. Например, предположим что мы создаем (CREATE) следующее
представление:
CREATE VIEW Ratingcount (rating, number) AS SELECT rating, COUNT (*) FROM Customers GROUP BY rating;
Это дает нам число заказчиков
которые мы имеем для каждого уровня оценки(rating). Вы можете затем сделать запрос этого
представления чтобы выяснить,
имеется ли какая-нибудь оценка, в настоящее время назначенная для трех заказчиков:
SELECT * FROM Ratingcount WHERE number = 3;
Посмотрим что случится если мы скомбинируем два предиката:
SELECT rating, COUNT (*) FROM Customers WHERE COUNT (*) = 3 GROUP BY rating;
Это недопустимый запрос. Агрегатные функции, такие как COUNT (СЧЕТ), не
могут использоваться в предикате. Првильным способом при формирова- нии вышеупомянутого
запроса, конечно же будет
следующий:
SELECT rating, COUNT (*) FROM Customers GROUP BY rating; HAVING COUNT (*) = 3;
Но SQL может не
выполнить превращения. Может ли равноценный запрос вместо запроса Ratingcount потерпеть
неудачу? Да может! Это -
неоднозначная область SQL, где методика использования представлений может дать хорошие
результаты. Самое лучшее
что можно сделать в случае, когда об этом ничего не сказано в вашей системной документации,
так это попытка в ней
разобраться. Если команда допустима, вы можете использовать представления чтобы установить
некоторые ограничения
SQL в синтаксисе запроса.