Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Рекурсия CTE и Order By / 14 сообщений из 14, страница 1 из 1
25.09.2019, 17:32
    #39867022
Qwe.Qwe1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия CTE и Order By
Есть у меня таблица:
Код: 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
25.09.2019, 17:35
    #39867028
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсия CTE и Order By
Qwe.Qwe1,

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

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

что-то типа

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

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

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

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

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

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

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

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



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




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

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

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


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