Создание естественного иерархического порядка с использованием рекурсивного SQL - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть таблица, содержащая категории с внутренним родительским дочерним отношением.

Таблица выглядит следующим образом:

ID | ParentID | OrderID
---+----------+---------
1  | Null     | 1
2  | Null     | 2
3  | 2        | 1
4  | 1        | 1

OrderID - это порядок внутри текущего уровня.

Я хочу создать рекурсивный запрос SQL для создания естественного порядка таблицы.

Значение вывода будет примерно таким:

ID   |  Order
-----+-------
1    | 100
4    | 101
2    | 200
3    | 201

Цените любую помощь.

Спасибо

1 Ответ

0 голосов
/ 23 декабря 2018

Я не совсем уверен, что вы подразумеваете под "естественным порядком", но следующий запрос генерирует результаты, которые вы хотите получить для этих данных:

with t as (
      select v.*
      from (values (1, NULL, 1), (2, NULL, 2), (3, 2, 1), (4, 1, 1)) v(ID, ParentID, OrderID)
     )
select t.*,
       (100 * coalesce(tp.orderid, t.orderid) + (case when t.parentid is null then 0 else 1 end)) as natural_order
from t left join
     t tp
     on t.parentid = tp.id
order by natural_order;
...