Рекурсивные запросы
Экономия времени с помощью рекурсивного запроса
Получить нужную информацию будет проще, если создать единственный рекурсивный запрос, который сделает всю работу за одну операцию. Вот его синтаксис:
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 |