(4, 1, 'AIR'), (5, 2, 'SUBMARINE'),
(6, 2, 'BOAT'), (7, 3, 'CAR'),
(8, 3, 'TWO WHEELES'), (9, 3, 'TRUCK'),
(10, 4, 'ROCKET'), (11, 4, 'PLANE'),
(12, 8, 'MOTORCYCLE'), (13, 8, 'BYCYCLE');
Обычно иерархия схематизируется авто-ссылкой, которая имеет место и здесь: внешний ключ ссылается на первичный ключ той же таблицы. Имеющиеся данные можно трактовать следующим образом:
ALL
|--SEA
| |--SUBMARINE
| |--BOAT
|--EARTH
| |--CAR
| |--TWO WHEELES
| | |--MOTORCYCLE
| | |--BYCYCLE
| |--TRUCK
|--AIR
|--ROCKET
|--PLANE
Построим запрос. Необходимо узнать, откуда пришел МОТОЦИКЛ (MOTORCYCLE). Другими словами, требуется найти всех предков "МОТОЦИКЛА". Начать следует со строки данных, которая содержат motorcycle:
| Результат
| |
| NAME
| ID_FATHER
|
| MOTORCYCLE
|
|
SELECT NAME, ID_FATHER
FROM Tree
WHERE NAME = 'MOTORCYCLE';
Мы должны иметь родительский ID, чтобы перейти к следующему шагу. Второй запрос, который делает этот следующий шаг, должен быть написан подобно следующему:
SELECT NAME, ID_FATHER
FROM Tree;
Запросы отличаются только тем, что мы не задаем фильтр WHERE для перехода к следующему шагу. Затем мы должны объединить эти два запроса с помощью UNION ALL, что определит пошаговый метод:
SELECT NAME, ID_FATHER
FROM Tree
WHERE NAME = 'MOTORCYCLE'
UNION ALL
SELECT NAME, ID_FATHER
FROM Tree;
Теперь разместим все это в CTE:
WITH
Tree_CTE (data, id)
AS (SELECT NAME, ID_FATHER