Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Qwe.Qwe1 Member Откуда: Сообщений: 263 |
Есть у меня таблица:
С помощью классического рекурсивного запроса с CTE получаю перечень всего иерархического дерева. А как выводить все тоже, но с учетом колонки SeqOrder? With Tree As ( Select ID, ParentID, Name, SeqOrder, 0 LevelNumber From dbo.MyTables1 Where ParentID Is Null Union All Select L.ID, L.ParentID, L.Name, L.SeqOrder, LevelNumber + 1 From dbo.MyTables1 L Join Tree T On T.ID = L.ParentID ) Select Space(LevelNumber * 5) + Cast(SeqOrder as varchar(10)) + ' ' + Name From Tree Вот так хотелось бы увидеть (SeqOrder задан в БД):
|
25 сен 19, 17:32 [21979136] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
Qwe.Qwe1, а что значит "с учетом"? |
25 сен 19, 17:35 [21979144] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
добавьте поле ID(или SeqOrder, если корневые элементы должны тоже в этом порядке следовать) из нерекурсивной части в качестве поля RootID и транслируйте в рекурсивной тогда итог можно будет отсортировать по RootID+SeqOrder |
25 сен 19, 17:38 [21979150] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
Формируйте "полный путь" до элемента, и сортируйте по нему. что-то типа With Tree As ( Select ID, ParentID, Name, SeqOrder, 0 LevelNumber, ord = cast(SeqOrder as binary(4)) From dbo.MyTables1 Where ParentID Is Null Union All Select L.ID, L.ParentID, L.Name, L.SeqOrder, LevelNumber + 1, ord = t.ord + cast(l.SeqOrder as binary(4)) From dbo.MyTables1 L Join Tree T On T.ID = L.ParentID ) Select Space(LevelNumber * 5) + Cast(SeqOrder as varchar(10)) + ' ' + Name From Tree order by ord |
25 сен 19, 17:41 [21979156] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
При уровне вложенности больше 1 не прокатит. |
||
25 сен 19, 18:28 [21979209] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
ага. но это тоже лечится. надо еще уровень вложенности добавить. и сортировать по рут+уровень +сиквенс справедливости ради, и ваше решение ругнется на несоответствие типов |
||||
25 сен 19, 19:12 [21979226] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
хотя, нифига так не лечится |
||||
25 сен 19, 19:18 [21979228] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Для ord нужно делать приведение к одному типу, тогда будет везде работать. |
||
25 сен 19, 19:59 [21979242] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
да я прям на форуме писал, тестовых данных то нет , ord = cast(cast(SeqOrder as binary(4)) as varbinary(8000)) вот так должно заработать, при уровне вложенности до 2000 и SeqOrder не больше int |
||
25 сен 19, 20:05 [21979249] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8730 |
По-моему, нет.
Да, я забыл про это просто. Принцип показал. |
||||
25 сен 19, 20:06 [21979250] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||||
25 сен 19, 20:47 [21979275] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
на днях там фактически был один и тот же тип в рекурсивной и нерекурсивной части. но без явного приведения. тут же явно разная длина, поэтому точно падало бы, независимо от версии. |
||||
25 сен 19, 20:59 [21979283] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||||
25 сен 19, 21:08 [21979292] Ответить | Цитировать Сообщить модератору |
Qwe.Qwe1 Member Откуда: Сообщений: 263 |
msLex, спасибо! |
26 сен 19, 09:20 [21979447] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |