-
Имеем запрос, использующий cte: /*mssql2005*/ with testtest(id, pid, level) as ( select id, pid, 0 as level from test where pid is null union all select e.id, e.pid, level + 1 from test e join testtest d on e.pid = d.id ) select * from testtest
Можно ли наточить запрос (тот что выше) так, чтобы он сортировал записи древовидного запроса аналогично оракловому :
select t.*,level from test t connect by prior id=pid start with pid is null
то есть требуется чтобы было : первый рутовый элемент, все его дети и дети их детей, затем следующий рутовый элемент и т.д
-
пока удалось забацать это через производные строковые поля но может есть способ понативнее?
WITH menu_tree(id, pid, caption, mlevel) AS ( SELECT ID, PID, caption, cast('0' + cast(id as varchar(10)) as varchar(10)) AS mlevel FROM menu WHERE PID IS NULL UNION ALL SELECT e.ID, e.PID, e.caption, cast(mlevel + cast(e.id as varchar(10)) as varchar(10)) as mlevel FROM menu e JOIN menu_tree d ON e.pid = d.id ) SELECT * FROM menu_tree order by mlevel
-
Это что? Типа давайте наморщим лоб? Срочное письмо Билу? Ты бы БД попроще делал, и нормализацию соблюдал. Глядишь, и вопросов бы нЕ было...
-
скажи проще: ты в этом ни бум-бум и тебе лично такое никогда в голову не приходило.
нормализацию еще приплел. пипец....
-
Ты бы БД попроще делал
нафик залезать в ветку, если для тебя табличка
id,pid,caption
выглядит сложной?
-
> Медвежонок Пятачок © (31.12.08 13:52) [1]
В оракле order by по connect by тоже нетривиальная задачка. До 10-ки никак не работала. Без сортировки выдавалось все по уровням, но даже отсортировать по алфавиту внутри ветки не получалось. Помогало создание индекса типа PID, CAPTION, но не гарантировалось, что всегда будет работать.
Вывод - работает хоть так и будь счастлив :)
|