((S [ S # ] MINUS (SP WHERE P# = ‘P2’) [S # ])
JOIN S) [SNAME]
В результате получаем единственный атрибут SNAME.
Разберем последний пример несколько подробнее, чтобы проиллюстрировать еще один момент. Не всегда просто представить себе, как выразить данный запрос в виде одной вложенной формулы (особенно если запрос сложный). Однако это и не обязательно. Вот пошаговое решение нашей проблемы:
T1: = S [ S# ];
T2: = SP WHERE P# = ‘P2’;
T3: = T2 [ S# ];
T4: = T1 MINUS T3;
T5: = T4 JOIN S;
T6: = T5 [SNAME];
Отношение Т6 содержит необходимый результат.
Пояснение. Здесь знак ‘’: =’’ означает оператор присвоения отношений (подробнее обсуждается ниже в этой главе). Для примера будем подразумевать, что имена отношений вида Ti используются системой для обращения к временным отношениям, которые автоматически создаются, когда им впервые присваиваются значения, и автоматически уничтожаются в некоторое подходящее время (например, в конце сеанса). Затем, если система включает возможность отсрочки вычислений (как, например, это делает система PRTV [6.8]), то разбиение запроса на последовательность небольших шагов таким способом не будет требовать абсолютно никаких нежелательных затрат производительности. Вместо этого весь запрос можно выполнить следующим образом.
|
|
1. Предположим, что за приведенной последовательностью шагов следует запрос отображения на экран отношения Т6 (с помощью оператора DISPLAY нашего гипотетического языка). В запросе отображения на экран предполагается, что система не может отложить вычисление на какое-то время, а вместо этого должна как-то вычислить значение Т6.
2. Для того чтобы вычислить значение Т6, которое является проекцией Т5 по атрибуту SNAME, система должна сначала вычислить значение Т5; чтобы вычислить значение Т5, которое является соединением Т4 и S. система должна сначала вычислить значение Т4 и т.д. Иными словами, система должна эффективно вычислять исходные вложенные выражения, точно так же, как пользователь, в первую очередь, должен эффективно писать такие вложенные запросы.
В следующем разделе вы кратко ознакомитесь с общими вопросами вычисления таких вложенных выражений (к этой теме мы еще вернемся далее в книге).