Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Рекурсия CTE и Order By  [new]
Qwe.Qwe1
Member

Откуда:
Сообщений: 244
Есть у меня таблица:

ID (int)
ParentID (int)
Name varchar(100)
SeqOrder (int)

С помощью классического рекурсивного запроса с 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 задан в БД):

1 Фрукты
1 Яблоко
2 Апельсин
2 Овощи
1 Картофель
2 Лук
...
25 сен 19, 17:32    [21979136]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Qwe.Qwe1,

а что значит "с учетом"?
25 сен 19, 17:35    [21979144]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
добавьте поле ID(или SeqOrder, если корневые элементы должны тоже в этом порядке следовать) из нерекурсивной части в качестве поля RootID
и транслируйте в рекурсивной

тогда итог можно будет отсортировать по RootID+SeqOrder
25 сен 19, 17:38    [21979150]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
msLex
Member

Откуда:
Сообщений: 8072
Формируйте "полный путь" до элемента, и сортируйте по нему.

что-то типа

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]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
msLex
Member

Откуда:
Сообщений: 8072
Посетитель
добавьте поле ID(или SeqOrder, если корневые элементы должны тоже в этом порядке следовать) из нерекурсивной части в качестве поля RootID
и транслируйте в рекурсивной

тогда итог можно будет отсортировать по RootID+SeqOrder

При уровне вложенности больше 1 не прокатит.
25 сен 19, 18:28    [21979209]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
msLex
Посетитель
добавьте поле ID(или SeqOrder, если корневые элементы должны тоже в этом порядке следовать) из нерекурсивной части в качестве поля RootID
и транслируйте в рекурсивной

тогда итог можно будет отсортировать по RootID+SeqOrder

При уровне вложенности больше 1 не прокатит.

ага. но это тоже лечится. надо еще уровень вложенности добавить. и сортировать по рут+уровень
+сиквенс

справедливости ради, и ваше решение ругнется на несоответствие типов
25 сен 19, 19:12    [21979226]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Посетитель
msLex
пропущено...

При уровне вложенности больше 1 не прокатит.

ага. но это тоже лечится. надо еще уровень вложенности добавить. и сортировать по рут+уровень
+сиквенс

справедливости ради, и ваше решение ругнется на несоответствие типов

хотя, нифига так не лечится
25 сен 19, 19:18    [21979228]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Посетитель
справедливости ради, и ваше решение ругнется на несоответствие типов
Там от версии зависит.
Для ord нужно делать приведение к одному типу, тогда будет везде работать.
25 сен 19, 19:59    [21979242]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
msLex
Member

Откуда:
Сообщений: 8072
Посетитель
справедливости ради, и ваше решение ругнется на несоответствие типов


да я прям на форуме писал, тестовых данных то нет

,  ord = cast(cast(SeqOrder as binary(4)) as varbinary(8000)) 


вот так должно заработать, при уровне вложенности до 2000 и SeqOrder не больше int
25 сен 19, 20:05    [21979249]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
msLex
Member

Откуда:
Сообщений: 8072
alexeyvg
Там от версии зависит.

По-моему, нет.




alexeyvg
Для ord нужно делать приведение к одному типу, тогда будет везде работать.

Да, я забыл про это просто.
Принцип показал.
25 сен 19, 20:06    [21979250]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
msLex
alexeyvg
Там от версии зависит.

По-моему, нет.
Я сам не сталкивался, но буквально на днях тут прочитал.
25 сен 19, 20:47    [21979275]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
alexeyvg
msLex
пропущено...

По-моему, нет.
Я сам не сталкивался, но буквально на днях тут прочитал.


на днях там фактически был один и тот же тип в рекурсивной и нерекурсивной части. но без явного приведения.
тут же явно разная длина, поэтому точно падало бы, независимо от версии.
25 сен 19, 20:59    [21979283]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Посетитель
alexeyvg
пропущено...
Я сам не сталкивался, но буквально на днях тут прочитал.

на днях там фактически был один и тот же тип в рекурсивной и нерекурсивной части. но без явного приведения.
тут же явно разная длина, поэтому точно падало бы, независимо от версии.
А, понял, спасибо.
25 сен 19, 21:08    [21979292]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия CTE и Order By  [new]
Qwe.Qwe1
Member

Откуда:
Сообщений: 244
msLex, спасибо!
26 сен 19, 09:20    [21979447]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить