powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия CTE и Order By
14 сообщений из 14, страница 1 из 1
Рекурсия CTE и Order By
    #39867022
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть у меня таблица:
Код: plaintext
1.
2.
3.
4.
ID (int)
ParentID (int)
Name varchar(100)
SeqOrder (int)

С помощью классического рекурсивного запроса с CTE получаю перечень всего иерархического дерева. А как выводить все тоже, но с учетом колонки SeqOrder?

Код: sql
1.
2.
3.
4.
5.
6.
7.
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 задан в БД):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
1 Фрукты
    1 Яблоко
    2 Апельсин
2 Овощи
    1 Картофель
    2 Лук
...
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867028
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1,

а что значит "с учетом"?
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867032
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
добавьте поле ID(или SeqOrder, если корневые элементы должны тоже в этом порядке следовать) из нерекурсивной части в качестве поля RootID
и транслируйте в рекурсивной

тогда итог можно будет отсортировать по RootID+SeqOrder
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867035
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Формируйте "полный путь" до элемента, и сортируйте по нему.

что-то типа

Код: sql
1.
2.
3.
4.
5.
6.
7.
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 
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867049
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетительдобавьте поле ID(или SeqOrder, если корневые элементы должны тоже в этом порядке следовать) из нерекурсивной части в качестве поля RootID
и транслируйте в рекурсивной

тогда итог можно будет отсортировать по RootID+SeqOrder
При уровне вложенности больше 1 не прокатит.
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867059
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexПосетительдобавьте поле ID(или SeqOrder, если корневые элементы должны тоже в этом порядке следовать) из нерекурсивной части в качестве поля RootID
и транслируйте в рекурсивной

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

справедливости ради, и ваше решение ругнется на несоответствие типов
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867061
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПосетительmsLexпропущено...

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

справедливости ради, и ваше решение ругнется на несоответствие типов
хотя, нифига так не лечится
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867069
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетительсправедливости ради, и ваше решение ругнется на несоответствие типовТам от версии зависит.
Для ord нужно делать приведение к одному типу, тогда будет везде работать.
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867073
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетительсправедливости ради, и ваше решение ругнется на несоответствие типов

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

Код: sql
1.
,  ord = cast(cast(SeqOrder as binary(4)) as varbinary(8000)) 



вот так должно заработать, при уровне вложенности до 2000 и SeqOrder не больше int
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867074
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgТам от версии зависит.
По-моему, нет.




alexeyvgДля ord нужно делать приведение к одному типу, тогда будет везде работать.
Да, я забыл про это просто.
Принцип показал.
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867082
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexalexeyvgТам от версии зависит.
По-моему, нет.Я сам не сталкивался, но буквально на днях тут прочитал.
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867088
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgmsLexпропущено...

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

на днях там фактически был один и тот же тип в рекурсивной и нерекурсивной части. но без явного приведения.
тут же явно разная длина, поэтому точно падало бы, независимо от версии.
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867092
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посетительalexeyvgпропущено...
Я сам не сталкивался, но буквально на днях тут прочитал.
на днях там фактически был один и тот же тип в рекурсивной и нерекурсивной части. но без явного приведения.
тут же явно разная длина, поэтому точно падало бы, независимо от версии.А, понял, спасибо.
...
Рейтинг: 0 / 0
Рекурсия CTE и Order By
    #39867164
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex , спасибо!
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия CTE и Order By
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]