рекурсивный запрос списка смежности для предварительного обхода дерева в SQL?

Я переношу данные из одной схемы базы данных в другую. Старый схема имеет систему категоризации на основе списка смежности, с id, категория и parent_id. Если одна категория меньше второй, это категория имеет второй идентификатор в качестве родительского идентификатора. Например:

+-------------+----------------------+--------+
| category_id | name                 | parent |
+-------------+----------------------+--------+
|           1 | ELECTRONICS          |   NULL |
|           2 | TELEVISIONS          |      1 |
|           3 | TUBE                 |      2 |
|           4 | LCD                  |      2 |
|           5 | PLASMA               |      2 |
|           6 | PORTABLE ELECTRONICS |      1 |
|           7 | MP3 PLAYERS          |      6 |
|           8 | FLASH                |      7 |
|           9 | CD PLAYERS           |      6 |
|          10 | 2 WAY RADIOS         |      6 |
+-------------+----------------------+--------+

Новая схема имеет модифицированный алгоритм обхода дерева предварительного порядка:

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
+-------------+----------------------+-----+-----+

Примеры взяты из статьи Управление иерархическими данными в MySQL .

В любом случае, я могу написать php скрипт с рекурсивной функцией который перенесет список смежности в древовидную структуру предварительного заказа. Обычно для каждой строки он вставляет пустое значение 'rgt', выглядит для детей, применяет к ним функцию рекурсивно, отслеживая счетчика, а затем обновляет значение 'rgt'.

Но я хочу сделать это на чистом SQL. Однако я не знаю достаточно, чтобы понять закрепиться на нем. Для начала, я не знаю, сможете ли вы сделать это с помощью рекурсивный запрос, или если есть другие способы сделать это.

6
задан Paŭlo Ebermann 21 August 2011 в 23:05
поделиться