|
Программирование >> Sql: полное руководство
Вот пример сгруппированного представления: Создать представление, включающее суммарные данные о заказах по каждому служащему. CREATE VIEW ORD BY REP (WHO, HOW MANy, TOTAL, LOW, HIGH, AVERAGE) AS SELECT REP, CODNT(*), S0M(AMO0NT), MIN(AMO0NT), MAX (AMOUNT) , AVG(AMOUNT) FROM ORDERS GROUP BY REP Как видно из этого примера, в определении сфуппированного представления всегда содержится список имен столбцов. В этом списке присваиваются имена тем столбцам Сфуппированного представления, которые являются производными от статистических функций, таких как sum() и min(). В нем также может быть задано измененное имя сфуппированного столбца. В данном примере столбец rep таблицы orders становится столбцом who представления ord by rep. После создания сфуппированного представления его можно использовать для упрощения запросов. Например, результатом приведенного ниже запроса является отчет, содержащий суммы заказов по каждому служащему Отобразить на экране имя, число заказов, общую стоимость заказов и среднюю стоимость заказа по каждому служащему SELECT NAME, HOW MANY, TOTAL, AVERAGE FROM SALESREPS, ORD BY REP WHERE WHO = EMPL NDM ORDER BY TOTAL DESC
В отличие от горизонтальных и вертикальных представлений, каждой сфоке сгруппированного представления не соответствует какая-то одна строка исходной таблицы. Сфуппированное представление не является просто фильфом исходной таблицы, скрывающим некоторые сфоки и столбцы. Оно отображает исходную таблицу в виде резюме, поэтому поддержка такой виртуальной таблицы требует от СУБД значительного объема вычислений. К сгруппированным представлениям можно обращаться с запросами точно так *е, как и к более простым представлениям. Однако сфуппированные запросы нельзя обновлять. Причина очевидна: что значит, например, обновить среднюю величину заказа для служащего с идентификатором 105 ? Так как каждая сфока сфуппированного представления соответствует группе сфок исходной таблицы, а столбцы, как Правило, содержат вычисляемые данные, невозможно преобразовать запрос на обновление Сфуппированного представления в запрос на обновление сфок исходной таблицы. Таким образом, сгруппированные представления функционируют как представления, доступные только для чтения , к которым можно обращаться с запросами на выборку, но не на обновление. Для сгруппированных представлений справедливы ограничения, накладываемые в SQL на вложенные статистические функции. Вспомним (глава 8), что вложенные конструкции, такие как, например, MIN (MIN (А) ) являются недопустимыми в выражениях SQL. Хотя в сгруппированных представлениях статистические функции спрятаны от пользователя в списке выбранных столбцов, СУБД знает о них и соблюдает это ограничение. Рассмотрим пример: Для каждого офиса вывести на экран диапазон средних значений заказов для всех служащих, работающих в офисе. SELECT REP OFFICE, MIN(AVERAGE), MAX(AVERAGE) FROM SALESREPS, ORD BY REP WHERE EMPL NOM = WHO GROOP BY REP OFFICE Error: Nested column function reference Данный запрос, хотя и выглядит как вполне допустимый, тем не менее вызывает ощибку. Это запрос к двум таблицам, фуптшрующий строки представления ord by rep по офисам, в которых работают служащие. Проблема связана со статистическим>1 функциями mino и мах о в списке выбранных столбцов. Аргумент этих статистических функций, столбец average, сам является результатом статистической функции. В действительности данный запрос выглядит следующим образом: SELECT REP OFFICE, MIN(AVG(AMOUNT)), MAX(AVG(AMOUNT)) FROM SALESREPS, ORDERS WHERE EMPL NUM = REP GROUP BY REP GROUP BY REP OFFICE Такой запрос является недопустимым, поскольку содержит два предложения group by И вложенные статистические функции. К сожалению, как видно из этого примера, применение допустимой инструкции select может вызвать ощибку, если одна из исходных таблиц является сфуппированным представлением. Такую ситуацию предвидеть невозможно; когда СУБД выдает сообщение об ощибке, необходимо просто определить ее причину. Объединенные представления Часто представления используют для упрощения многотабличных запросов. Задавая в определении представления двух- или фехтабличный запрос, можно создать объединенное представление - виртуальную таблицу, данные в которую извлекаются из двух или фех различных таблиц. После создания такого представления к нему можно обращаться с помощью однотабличного запроса; в противном случае пришлось бы применять двух- или фехтабличное объединение. Предположим, например, что Сэм Кларк (Sam Clark), вице-президент по продажам, часто обращается с запросами к таблице orders учебной базы данных. Однако Сэм не любит работать с идентификаторами служащих и клиентов. Он хотел бы воспользоваться такой версией таблицы orders, где вместо идентификаторов стояли бы имена. Ниже показано представление, отвечающее требованиям Сэма: Создать представление таблицы orders с именами вместо идентификаторов. create view order info (order nom, company, rep name, amount) as select order nom, company, name, amoont from orders, customers, salesreps where cust = cost nom and rep = empl num Данное представление является объединением трех таблиц. Как и в случае сгруппированного представления, для создания такой виртуальной таблицы требуется значительный объем работы. Источником каждой строки представления является комбинация трех строк: по одной строке из таблиц orders, customers и salesreps. Несмотря на свое относительно сложное определение, это представление может принести реальную пользу. Вот запрос к представлению, дающий сводку заказов, сфуппированную по служащим: Для каждого тужащего отобразить на экране общую стоимость заказов по каждой компании. select rep name, company, som(amount) from order info group by rep name, company Rep name company som(amount) Bill Adams Acme Mfg. $35,582.00 Bob Smith Ian & Schmidt $22,500.00 Dan Roberts First Corp. $3,978.00 Larry Fitch Midwest Systems $3,542.00 Larry Fitch Zetacorp $47,925.00 Обратите внимание: этот запрос является однотабличной инструкцией select, и он гораздо проще, чем эквивалентная трехтабличная инструкция select для исходных таблиц: SELECT NAME, COMPANY, SUM(AMOONT) FROM SALESREPS, ORDERS, CUSTOMERS WHERE REP = EMPL NUM AND CUST = COST NUM GROUP BY NAME, COMPANY Аналогично, с помощью следующего запроса к данному представлению можно легко получить список крупных заказов, показывая, кто их сделал и кто принял: Вывести список крупных заказов, упорядоченных по стоимости. SELECT COMPANY, AMOUNT, REP NAME FROM ORDER INFO WHERE AMOONT > 20000.00
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |