|
вопрос по СТЕ
|
|||
---|---|---|---|
#18+
Всем привет. Застрял на задаче, помогите решить ее, с рекурсиями на ВЫ. Задача: В исходных данных есть колонка "RelationPartnerId", это ссылка на одного из партнеров указанных в колонке "PartnerId" (если значение 0, тогда партнер не ссылается на другого), помимо этого в таблице уже есть первичный набор связей "RelationId", который так же нужно учесть в расчете. Нужно собрать все и всех в общие связи (на основании колонок "RelationPartnerId" и "RelationId"), имя полученных связей = максимальному значению из колонки "RelationId". Код: 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.
Таким образом, Set1 должен собраться в одну связь, Set2 соберется в две связи, на выходе получается 3 связи: Результат: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Пытался решить рекурсией, т.к. за ранее неизвестно кто с кем в паре, и каждое вхождение связи в связь за счет значения в колонке "RelationPartnerId" может ссылаться на другую уже объединенную связь. Решал так: Код: 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.
но результата не могу получить, зацикливается.....вроде все делал по примеру, но они простые, с одним анкером. Помогите плз... =( ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 12:03 |
|
вопрос по СТЕ
|
|||
---|---|---|---|
#18+
поспешил с публикацией, пытался решать так: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 12:11 |
|
вопрос по СТЕ
|
|||
---|---|---|---|
#18+
IDVT, Вы хотите обойти все ветки, найти среди RelationId этой ветки максимальное значение и присвоить каждой записи этой ветки полученное значение? Причем, началом ветки считается строка, у которой RelationPartnerId = 0? Верно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 12:49 |
|
вопрос по СТЕ
|
|||
---|---|---|---|
#18+
Владислав Колосов, Да, все верно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2020, 13:36 |
|
вопрос по СТЕ
|
|||
---|---|---|---|
#18+
IDVT, не думаю, что эта задача эффективно решается без использования hierarchyid типа данных. Выполнение рекурсивного обхода по множеству корней одним запросом на достаточно большом объеме данных будет медленным. Для иерархического типа можно попробовать сгруппировать все элементы по корневому и среди них найти максимальное значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2020, 12:02 |
|
вопрос по СТЕ
|
|||
---|---|---|---|
#18+
Владислав, спасибо за помощь! Буду открывать для себя hierarchyid. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2020, 14:03 |
|
вопрос по СТЕ
|
|||
---|---|---|---|
#18+
IDVT, Если речь идёт о дереве, charindex следует убрать. А для скорости стоит надеть на это битовую маску Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.04.2020, 20:40 |
|
|
start [/forum/topic.php?fid=46&fpage=61&tid=1686168]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
others: | 306ms |
total: | 451ms |
0 / 0 |