Год назад Djelf писал что иерархию делал по наименованиям
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/885#890На днях почитывал доки по sqlite.org и наткнулся на такой вариант:
with recursive регионы(parentid,id,descr,isfolder,level) as (
select
parentid, id, descr, isfolder, 0
from
[Справочник.Города]
where
parentid = :ПустойИД
union all
select
t.parentid, t.id, t.descr, t.isfolder,(r.level + 1) as level
from
[Справочник.Города] as t join регионы as r
on t.parentid = r.id
order by
level desc, isfolder, descr collate _1C
)
select
id as [Регион :Справочник.Города]
, descr as [Наименование :Строка]
, isfolder as [ЭтоГруппа :Число.1.0]
, parentid as [Родитель :Справочник.Города]
, level as [Уровень :Число.1.0]
from
регионы
Волшебство тут в "ORDER BY level desc". Если будет без desc то получится как обычно сначала 1 уровень, потом 2 и т.д. А при наличии desc получается иерархия.
Долго пытался виртуально в голове это прокрутить но так до конца и не понял как это работает. Успокоил себя тем что это специальная фича для построения графов
Я предполагаю что ORDER BY тут применяется после каждого UNION к очереди. Т.е. в доке написано что делается первый запрос результат помещается в очередь и тут к очереди применяется ORDER после этого берется первая строка из очереди и выполняется второй запрос. Первая строка из очереди помещается в результат CTE а результат из части UNION в очередь и тут опять к очереди применяется ORDER и поэтому со второго уровня оказываются в начале очереди и так далее.