Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Тоу Д. -> "Настройка SQL. Для профессионалов" -> 122

Настройка SQL. Для профессионалов - Тоу Д.

Тоу Д. Настройка SQL. Для профессионалов — СПб.: Питер, 2004. — 333 c.
ISBN 5-94723-959-0
Скачать (прямая ссылка): nastroykasqldlyaprof2004.djvu
Предыдущая << 1 .. 116 117 118 119 120 121 < 122 > 123 124 125 126 127 128 .. 161 >> Следующая

Запросы с представлениями

247

тимого, не равного null значения Address_ID, исходный запрос возвращает null для Shi pment_Date, несмотря на то, что соединение с Shi pments само по себе допустимо.

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

SELECT OV.Customer_Main_Phone. С.Honorific. OV.Customer_First_Name.

OV.Customer_Last_Name. С.Suffix. DV.Customer_Address_ID.

A.Address_ID Shi pment_Address_ID.

A.Street_Addr_Linel Shipment_Street_Address_Linel.

A.Street_Addr_Li ne2 Shi pment_Street_Address_Line2.

A.CityName Shipment_City_Name. A.State_Abbreviation Shipment_State.

A.ZIP_Code Shipment_ZIP. DD.Deferred_Ship_Date. OD.Item_Count.

DDT.Text. P.Prod_Description,

DECODE(A.Address_ID. NULL. TO_DATE(NULL).

S.Shipment_Date) Shipment_Date FROM Recent_Drder_V OV. Drder Details DD. Products P. Shipments S.

Addresses A. Code_Translations ODT1 Customers C WHERE UPPER(DV.Customer_Last_Name) LIKE :last_name||'%'

AND UPPER(OV.Customer_First_Name) LIKE :fіrst_name||'Я'

AND DD.0rder_ID = DV.0rder_ID AND 0V.Customer_ID = C.Customer_ID AND 0D.Product_ID = P.Product_ID(+)

AND 0D.Shipment_ID = S.Shipment_ID(+)

AND S.AddressID = A.Address_ID(+)

AND 0D.Status_Code = ODT.Code

AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'

ORDER BY DV.Customer_ID, 0V.0rder_ID Desc.

DECODE(A.Address_ID. NULL. T0_NUMBER(NULL). S.Shipment_ID).

0D.0rder_Detail_ID

В этом запросе есть два изменения, которые заставляют запрос возвращать результаты, как если бы соединение с Shipments выдавало внешний случай независимо от того, возникает ли внешний случай в соединении с Addresses. Без представления запрос будет обрабатывать соединение с Shi pments независимо от соединения с Addresses. Однако выражение DECODE в конце списка SELECT и в середине списка ORDER BV заставляет внутренний случай первого соединения эмулировать внешний случай соединения (создавая null вместо Shipment_Date и Shi pment_I D), независимо от того, будет ли при соединении с Addresses найден внешний случай.

Иногда у вас будут действительно хорошие причины использовать представление вместо простых таблиц. Наиболее распространенная причина — необходимость обойти ограничения в автоматически сгенерированном SQL-коде. Функционально вам может понадобиться какой-то сложный синтаксис SQL, который генератор SQL обработать не может. Распространенный обход — скрыть эту сложность в оп-
248

7. Диаграммное изображение и настройка сложных SQL-запросов

ределяющем представление запросе, который вы создадите вручную, и заставить генератор SQL считать представление простой таблицей, скрывая от него все сложности. В таких случаях у вас может не получиться избежать представлений, как, например, я предполагал в предыдущих решениях. Tогда альтернативный подход — расширить использование представления, скрывая больше SQL в определении представления. Например, так как предыдущая задача включала внешнее соединение с представлением, то вы могли бы решить ее, заключив внешнее соединение в запрос, определяющий представление. Тогда вместо Shipment_V вы бы использовали OrderDetai 1_V и следующий определяющий представление запрос:

CREATE VIEW Order_Detail_V AS

SELECT A.Address_ID Shipment_Address_ID.

A.Street_Addr_Linel Shipment_Street_Address_Linel.

A.Street_Addr_Line2 Shipment_Street_Address_Line2,

A.City_Name Shipment_City_Name. A.State_Abbreviation Shipment_State.

A.ZIP_Code Shipment_ZIP. S.Shipment_Date. S.Shipment_ID.

OD.Deferred_Ship_Date. 0D.Item_Count. DD.Order_ID.

OD.Order_Detail_ID. OD.Product_ID. 0D.Status_Code FROM Shipments S. Addresses A. Order_DetaiIs OD WHERE 0D.Shipment_ID = S.Shipment_ID(+)

AND S.Address_ID = A.Address_ID(+)

Тогда запрос, использующий расширенное представление, становится таким:

SELECT OV.Customer_Main_Phone. С.Honorific, DV.Customer_First_Name.

DV.Customer_Last_Name. С.Suffix, OV.Customer_Address_ID,

ODV.Shi pment_Address_ID. ODV.Shi pment_Street_Address_Li nel,

ODV.Shi pment_Street_Address_Li ne2. ODV.Shi pment_Ci ty_Name.

0DV.Shiprient_State. 0DV.Shipment_Zip. 0DV.Deferred_Ship_Date.
Предыдущая << 1 .. 116 117 118 119 120 121 < 122 > 123 124 125 126 127 128 .. 161 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100