Database Programming & Design



         

The SQL Double Double - часть 3


условие существования, по одной за раз. Последним выполняется

нижний запрос, как обычно, возвращающий true, если удается найти

хотя бы одну строку, удовлетворяющую условию, и false, если не

удается найти ни одной такой строки. Вот пример запроса с двойной

корреляцией, в котором используются псевдонимы имен таблиц BLK1,

BLK2 и BLK3:

SELECT SNAME

FROM S BLK1

WHERE NOT EXISTS

(SELECT 1

FROM SP BLK2

WHERE BLK2.S# = 'S2'

AND NOT EXISTS

(SELECT 1

FROM SP BLK3

WHERE BLK3.S# = BLK1.S#

AND BLK3.P# = BLK2.P#))

Этот запрос выдает список поставщиков, поставляющих все детали,

поставляемые поставщиком S2. Всем процессом управляет верхний

список поставщиков (BLK1.S#). Один поставщик передается нижнему

запросу. Далее выполняется средний запрос, формирующий список

деталей, уточненных условием WHERE BLK2.S# = 'S2'. Одна деталь

(BLK2.P#) передается от среднего нижнему запросу. Затем

выполняется нижний запрос и возвращает true или false среднему

запросу. Если результатом нижнего запроса является true, средний

запрос передает нижнему другую деталь (BLK2.P#). Этот цикл

продолжается до тех пор, пока либо не встретится результат false,

либо не исчерпаются все детали. Если нет больше деталей, то это

означает, что результат среднего запроса пуст и верхнему запросу

передается false. Это является условием пропуска текущей строки

верхнего запроса в окончательный результат. В результирующее

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

все те детали, что и поставщик S2.

Если в какой-то момент результатом нижнего запроса является

false, то среднему запросу разрешается выполняться, и он

возвращает верхнему запросу true. По этому поводу верхний запрос

выбирает следующего поставщика (BLK1.S#) и начинает заново весь

цикл. Этот процесс позволяет найти всех поставщиков, которые

поставляют по меньшей мере все детали, поставляемые поставщиком

S2.

Двойная корреляция с двойным условием NOT EXISTS представляет

мощный оператор реляционного деления.


Содержание  Назад  Вперед