Рекурсивные запросы с фразой WITH позволяют программисту больше, нежели запросы с CONNECT BY (тоже рекурсивные). Например, они позволяют накапливать изменения, и не испытывают необходимости в функциях LEVEL или SYS_CONNECT_BY_PATH, имея возможность легко их моделировать.
Пример запроса по маршрутам из Москвы с подсчетом километража: WITH stepbystep ( node, way, distance ) AS ( SELECT node, parent '-' node, distance FROM route WHERE parent = 'Москва'
UNION ALL SELECT r.node , s.way '-' r.node , r.distance + s.distance FROM route r INNER JOIN stepbystep s ON ( s.node = r.parent ) ) SELECT way, distance FROM stepbystep /
Ответ: WAY DISTANCE ---------------------------------------- ---------- Москва-Ленинград 696 Москва-Новгород 538 Москва-Новгород-Ленинград 717 Москва-Ленинград-Выборг 831 Москва-Новгород-Ленинград-Выборг 852
Запрос по маршрутам из Выборга аналогичен, но с поправкою на симметрию, вызванной движением по иерархии снизу вверх, а не сверху вниз: WITH stepbystep ( parent, way, distance ) AS ( SELECT parent, node '-' parent, distance FROM route WHERE node = 'Выборг'
UNION ALL SELECT r.parent , s.way '-' r.parent , r.distance + s.distance FROM route r INNER JOIN stepbystep s ON ( s.parent = r.node ) ) SELECT way, distance FROM stepbystep /
Ответ: WAY DISTANCE ---------------------------------------- ---------- Выборг-Ленинград 135 Выборг-Ленинград-Москва 831 Выборг-Ленинград-Новгород 314 Выборг-Ленинград-Новгород-Москва 852