|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Здравствуйте. Нужно найти конечного потомка. Такая таблица допустим. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Пойдём с первого. 78-394-357-301-271-502-271. Нужен, по сути, 502. Как-нибудь без рекурсии обойтись можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2020, 17:02 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
a_voronin, по заданию желательно сделать без неё. Да и не особо понимаю как) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2020, 17:24 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11 Как-нибудь без рекурсии обойтись можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2020, 17:32 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11, Курсоры вам в руки. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2020, 17:38 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Это, например, как реализовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.03.2020, 18:18 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Никто не подскажет? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 13:58 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
a_voronin Курсоры вам в руки. Earl11 Никто не подскажет? Это же азы программирования. Возьмите учебник по программированию на T-SQL, и проходите главу за главой, там циклы будут рассмотрены. Хотя, циклы есть в любом курсе программирования начального уровня. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 16:59 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
alexeyvg, так вопрос в чём: идёт цепочка допустим 78-394-357-301 и выходит такой момент 271-502-271-271-502-271 и дальше всё вокруг двух значений. И каждый раз проверять текущее значение с -2 значением? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 17:48 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11 alexeyvg, так вопрос в чём: идёт цепочка допустим 78-394-357-301 и выходит такой момент 271-502-271-271-502-271 и дальше всё вокруг двух значений. И каждый раз проверять текущее значение с -2 значением? И условием выхода из цикла должно быть не только отсутствие нового элемента, но и присутствия найденного элемента в этой временной табличке. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.03.2020, 22:54 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Иного решения нет, как понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 17:55 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11, В ссылке, которую я вам дал в самом начале -- где задача решается через рекурсию, присутствует защита от зацикливания. Просто вы вместо того, чтобы пойти по простому пути и одним запросом получить результат, городите непонятный огород с циклами, которые сложнее написать. Защита от зацикливания делается аналогично не зависимо от того, какой способ обхода дерева используется. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 18:05 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
У потомка нет потомков. Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 18:07 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11 Иного решения нет, как понимаю? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
Вот это защита от зацикливания Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 18:12 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11 Иного решения нет, как понимаю? Если рекурсивный CTE, то решение дал a_voronin. mikron У потомка нет потомков. Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 20:08 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
a_voronin Просто вы вместо того, чтобы пойти по простому пути и одним запросом получить результат Простой путь - это какой путь? Пусть рекурсия. Условие как прописать? Взять Ваш ответ Код: sql 1.
как будет обнаружен ноль, если цепочка повторяется?..Прошу прощения, но я немного не понимаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 21:40 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11 a_voronin Просто вы вместо того, чтобы пойти по простому пути и одним запросом получить результат Простой путь - это какой путь? Earl11 Пусть рекурсия. Условие как прописать? Взять Ваш ответ Код: sql 1.
как будет обнаружен ноль, если цепочка повторяется?..Прошу прощения, но я немного не понимаю. Earl11 как будет обнаружен ноль Вы имеете в виду CHARINDEX(...)=0? Вы смотрели, что эта за функция CHARINDEX ,и когда она возвращает 0? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2020, 23:14 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
nullin, А что битовые маски? В реальной задаче, а не этом прототипе -- числа до 1000000 -- вы какого размера маски предлагаете таскать, а если вообще строки произвольные. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 08:11 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
a_voronin, ну если так, то в binary(max) вылазит; если строки произвольные, то ещё нумеровать придётся. Для них максимальный объём ~134кк(256мб если unsigned) - про скорость я конечно говорить не буду, но если связываться с рекурсией в текущей реализации, то это вообще не про бытродействие :) В запросе ТС не нужно цепь выводить, а только скаляр, поэтому именно здесь применение масок очень оправдано. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 13:38 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Нужно только еще сделать fnMatchBit(), чтобы вместо CHARINDEX(...)=0 было [бит из binary по адресу байта добавляемого номера] & [бит этого номера] = 0. Вместо concat() где формируется цепочка, соответственно fnSetBit() ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 14:15 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
alexeyvg, просто нужен был конечный элемент, а получаю несколько цепочек. Ладно) Спасибо большое Вам и a_voronin ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 14:35 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11 alexeyvg, просто нужен был конечный элемент, а получаю несколько цепочек. Ладно) Нужно к нему добавить TOP 1, с сортировкой CHAIN DESC ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 14:38 |
|
Найти последнего потомка.
|
|||
---|---|---|---|
#18+
Earl11 Здравствуйте. Нужно найти конечного потомка. Такая таблица допустим. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Пойдём с первого. 78-394-357-301-271-502-271. Нужен, по сути, 502. Как-нибудь без рекурсии обойтись можно? Ну, если отбросить вопрос: "пачиму конечный потомок 502, а не 271?" То рекурсия не нужна от слова совсем. "Конечный потомок" = "элемент у которого нет потомков". Это делается в один тривиальный запрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2020, 15:35 |
|
|
start [/forum/topic.php?fid=46&msg=39942242&tid=1686275]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 326ms |
total: | 461ms |
0 / 0 |