Получить имена поставщиков, которые не поставляют деталь Р2

( ( 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 и т.д. Иными словами, система должна эффективно вычислять исходные вложенные выражения, точно так же, как пользователь, в первую очередь, должен эффективно писать такие вложенные запросы.

В следующем разделе вы кратко ознакомитесь с общими вопросами вычисления таких вложенных выражений (к этой теме мы еще вернемся далее в книге).