Иллюстрированный самоучитель по SQL для начинающих

Рекурсивные запросы

Экономия времени с помощью рекурсивного запроса

Получить нужную информацию будет проще, если создать единственный рекурсивный запрос, который сделает всю работу за одну операцию. Вот его синтаксис:

WITH RECURSIVE
ReachableFrom (Source, Destination)
AS (SELECT Source, Destination
FROM FLIGHT
UNION
SELECT in.Source, out.Destination
FROM ReachableFrom in, FLIGHT out
WHERE in.Destination = out.Source
)
SELECT * FROM ReachableFrom
WHERE Source = "Portland";

В начале первого прохода, выполняемого во время рекурсии, в таблице FLIGHT будет семь строк, а в ReachableFrom (означает "можно попасть из") – ни одной. Оператор UNION берет семь строк из FLIGHT и копирует их в таблицу ReachableFrom. Тогда в ReachableFrom появятся данные, показанные в табл. 12.2.

Таблица 12.2. Таблица ReachableFrom после одного прохода рекурсии.

Source Destination
Portland Orange County
Portland Charlotte
Portland Daytona Beach
Orange County Montgomery
Charlotte Memphis
Memphis Champaign
Montgomery Memphis

Интересное начнется уже при втором проходе. Предложение WHERE (WHERE in. Destination = out. Source)означает, что просматриваются только те строки в которых поле Destination таблицы ReachableFrom равно полю Source таблиш FLIGHT. Для каждой такой строки берутся значения поля Source из ReachableFrom и пол Destination из FLIGHT, а затем в качестве новой строки добавляются в ReachableFrom. Результат этого прохода показан в табл. 12.3.

Таблица 12.3. Таблица ReachableFrom после двух проходов рекурсии.

Source Destination
Portland Orange County
Portland Charlotte
Portland Daytona Beach
Orange County Montgomery
Charlotte Memphis
Memphis Champaign
Montgomery Memphis
Portland Montgomery
Portland Memphis
Orange County Memphis
Charlotte Champaign
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.