|
Программирование >> Хронологические базы данных
операторах выборки и предложения ADD в операторах EXTEND и SUMMARIZE. Так, например, запрос Определить номера поставщиков, которые могут поставить деталь с номером Р2 в день 8 для базы данных, представленной на рис. 22.4, можно выразить следующим образом. ( SP DURING WHERE Р# = Р# (Р2) AND d08 IN DURING ) { St } Замечание. На практике выражение d08 было бы заменено соответствующим литералом типа DAY. В качестве другого примера рассмотрим выражение, с помощью которого можно получить отношение, показывающее пары поставщиков, находящихся в одном и том же городе в одно и то же время, вместе с названиями городов и соответствующими датами. EXTEND { { { { S DURING RENAME St AS XSl, DURING AS XD ) { XSt, CITY, XD } JOIN ( S DURING RENAME S AS YSt, DURING AS YD ) { YSt, CITY, YD } ) WHERE XD OVERLAPS YD ) ADD { XD INTERSECT YD ) AS DURING ) { XS, YSt, CITY, DURING } Пояснения. С помощью оператора JOIN выполняется поиск пар поставщиков, которые находятся в одном и том же городе. Предложение WHERE ограничивает результат парами, которые находились в одном и том же городе в одно и то же время. Предложения EXTEND ... ADD используются для вычисления соответствующих интервалов. И в конце концов с помощью операции проекции получается желаемый результат. Теперь возвратимся к запросам 3.1 и 3.2 из раздела 22.3. Сначала рассмотрим запрос 3.1. В новой формулировке обозначим его как запрос 4.1. Для базы данных, представленной на рис. 22.4, он будет звучать следующим образом. Запрос 4.1. Получить пары атрибутов St, DURING для поставщиков, которые могут поставить некоторую деталь в некоторое время, где атрибут DURING означает период максимальной продолжительности, в течение которого поставщик с номером Sl действительно мог поставить некоторую деталь. Напомним, что в ранней версии этого запроса (запрос 2.1) необходимо было использовать группирование и обобщение, а именно - обращаться к операции SUMMARIZE. Поэтому неудивительно, что для формулировки запроса 4.1 также нужны определенные операции группирования и обобщения. Однако в данном случае мы будем формулировать требуемый запрос не сразу, а поэтапно. Первый этап представлен ниже. WITH SP DURING { SI, DURING } AS Tl : (Двоеточие указывает, что существует продолжение этого выражения.) На данном этапе в исходном отношении SP DURING просто отбрасываются номера деталей. Результирующее отношение Т1 имеет следующий вид.
Отметим, что в этом отношении содержатся избыточные данные. Например, излишне трижды говорить о том, что поставщик с номером S1 может что-то поставить в день 6. Поэтому требуемое отношение, назовем его RESULT, в котором уже нет подобной избыточности, будет таким.
Назовем этот результат свернутой формой отношения Т1 по атрибуту DURING. Подчеркнем, что значение атрибута DURING для данного поставщика в этой свернутой форме необязательно должно быть представлено как явное значение атрибута DURING для данного поставщика в отношении Tl, производной от которого является данная свернутая форма. В нашем примере это замечание относится, в частности, к поставщику с номером S4. Может показаться, что достичь такого состояния совсем несложно, получив эту свернутую форму с помощью простого выражения следующего вида. Т1 COALESCE DURING Однако к данной цели необходимо продвигаться постепенно. Прежде всего обратите внимание, что термин свернутая форма в двух предыдущих абзацах использовался в смысле, который несколько отличается от того, который вкладывался в это понятие в разделе 22.7. Оператор COALESCE, как он был определен в разделе 22.7, принимает в качестве входных данных и выдает в качестве выходных данных множество интервалов. Однако здесь рассматривается другая его версия - фактически перегруженная (см. главу 19) версия этого оператора, когда он в качестве входных данных принимает унарное отношение и в качестве выходных данных выдает другое отношение с тем же заголовком, причем оба отношения состоят из кортежей, которые содержат настоящие интервалы. Теперь подробнее рассмотрим этапы, которые позволяют перейти от отношения Т1 к отношению RESULT. WITH ( Tl GROUP ( DURING ) AS X ) AS T2 : (Напомним, что оператор GROUP подробно рассматривался в главе 6.) Отношение Т1 представлено ниже. DURING [d04.dl0] [d05,dl0] [d09.dl0] [dOe.dlO] DURING [d02,d04] [d03,d03] [d08.dl0] [dOQ.dlO] DURING [dOS.dlO] DURING [d06.d09] [d04.d08] \d05.dl0} Далее применим новую версию оператора COALESCE к отношениям, которые являются значениями атрибута X (его значения имеют тип отношения). WITH ( EXTEND Т2 COALESCE ( X ) AS Y ) { ALL BUT X } AS T3 : Отношение ТЗ выглядит так. DURING [d04,dl0] DURING [d02.d04] \d08.dl0 DURING [d08.dl0] DURING {d04,dl0]
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |