Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Есть древовидный справочник. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Эта структура осталась ещё от купленных давно компонент FibExTree. Менять не стал - удобно. получается справочник районов, т.е. примерно так: Беларусь->Минск->Боровцы. Таблица показывает пользователю только Боровцы. Есть процедура на клиенте, которая строит указанную цепочку в Calculated поле, но хотелсь бы на сервере и максимально быстрый алгоритм. В поле FULLPATH живёт вот такая цепочка "2775.141.2776.187.", т.е. цепочка из ID, 2775 - это корневой узел. Помогите, пожалуйста, построить на сервере, но чтобы максимально быстро и эффективно тоже с использованием вычисляемого поля. Просто я боюсь, что напишу процедуру далеко не самую быструю. Может быть уже есть готовые решения? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:17 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Забыл добавить: Firebird 2.5.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:17 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Индексы-то есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:21 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11В поле FULLPATH живёт вот такая цепочка "2775.141.2776.187.", т.е. цепочка из ID, 2775 - это корневой узел. Забавно... Корневой узел сделан позже, чем ветви. Перетаскивать можно или id с потолка взяты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:22 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Получается, что мне нужно сделать путь (path) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:23 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
wadmanX11В поле FULLPATH живёт вот такая цепочка "2775.141.2776.187.", т.е. цепочка из ID, 2775 - это корневой узел. Забавно... Корневой узел сделан позже, чем ветви. Перетаскивать можно или id с потолка взяты? в программе есть возможность переносить выделенные узлы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:26 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
wadman, да, конечно, но это пока что неважно же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:26 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Вот процедура путь добывает, но по именам. Id = BigInt, varchar-ы тоже были доменными типами, переделал руками. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:27 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Сейчас пытаюсь вникнуть в CTE и рекурсивные запросы - надеюсь, на правильном пути. Но до сего момента не использовал и не имею представления об этом пока что ничего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:28 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Вот что у меня получилось Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. http://www.sqlbooks.ru/printarticle.aspx?part=02&file=sql200509 14053226 правда, не сам допёр ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:46 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11, боюсь это далеко не самое эффективное решение. Ибо сначала будет построено дерево по всем записям, а только затем произойдёт фильтрация. Попробуй построить наоборот, т.е. от текущего узла к корню. Путь потом можно инвертировать функцией reverse ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:52 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисПуть потом можно инвертировать функцией reverse Та ну нафиг. 123-456 после REVERSE() 654-321 будет ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:55 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисX11, боюсь это далеко не самое эффективное решение. Ибо сначала будет построено дерево по всем записям, а только затем произойдёт фильтрация. Попробуй построить наоборот, т.е. от текущего узла к корню. Путь потом можно инвертировать функцией reverse так я и строю от текущего, т.е. последнего узла к корню Цепочка: "2775.141.2776.187.", 2775 - корень я строю от 187 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:57 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисИбо сначала будет построено дерево по всем записям Код: sql 1. 2. 3. только по корневым ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:58 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
DarkMaster, ммм... значит надо ещё подумать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 09:58 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#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. ничего не возвращает, т.е. процедура как бы не селективная получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:00 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11Вот что у меня получилось если нужно действительно нужно отфильтровать только от корня то вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. будет эффективней. Ибо в рекурсивные запросы предикаты не проталкиваются ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:08 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов Денисесли нужно действительно нужно отфильтровать только от корня то вот так нет, мне надо не от корня, а наоборот - от указанного текущего узла, и вверх до корня ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:13 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
и этот запрос пустой Код: sql 1. 2. 3. т.к. таких записей просто нет в таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:14 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
чтобы легче было представить: "ХАРЬКОВ>Город>САЛТОВКА>524м/р" вот код Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:19 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11, ну тогда надо разворачивать построение дерева. Я же говорю предикаты не проталкиваются. Будет построено дерево целиком и только потом к нему будет прилеплен фильтр. Т.е. по хорошему должно быть как-то так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:26 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
wadman, Ваш код вызывает Arithmetic overflow SQL Код: 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. цепочка небольшая - 2-3 узла, длина поля name - 20 символов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:27 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Код: sql 1. копипаста от другого запроса должно быть так Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:28 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов Денис Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. твой код с ошибками Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. и в результате вместо цепочки выдаёт только название текущего узла, где ID = 187 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:31 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11цепочка небольшая - 2-3 узла, длина поля name - 20 символов Предлагаю пройтись дебаггером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:33 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
wadmanX11цепочка небольшая - 2-3 узла, длина поля name - 20 символов Предлагаю пройтись дебаггером. зацикливается на одном и тот же самом нижнем узле PATH = APATH || '>' || PATH; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:37 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
wadman, исправленный запрос. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. А можешь дать немного данных для проверки? В общем тут идея проста двигаться в обратном направлении от потомка к корню дерева. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:40 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11, P.S. Забавно что объявлен домен INT. Что в сущности делать было вовсе не обязательно ибо у INTEGER и так есть псевдоним INT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:42 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов Денис Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ещё раз: код возвращает только название одного самого последнего узла, а цепочки нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:44 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисА можешь дать немного данных для проверки? в смысле... ну добавь три записи в таблицу.. всего делов-то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:45 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11, OK. Добавил данные,нашёл ошибку. Вот исправленная версия Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:50 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11wadmanпропущено... Предлагаю пройтись дебаггером. зацикливается на одном и тот же самом нижнем узле PATH = APATH || '>' || PATH; Потому что нужно внимательнее переносить код. X11 Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 10:52 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
pid - это ID или PARENT? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:01 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11pid - это ID или PARENT? ID - id, PID - parent id. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:06 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11, для пути в обратном порядке Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. и соответственно ХП Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:08 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
исправил Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ------ Performance info ------ Prepare time = 31ms Execute time = 0ms 2 узла в случае с рекурсией (другая таблица) 4 узла ------ Performance info ------ Prepare time = 47ms Execute time = 0ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:08 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов Денис Код: plsql 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. ------ Performance info ------ Prepare time = 32ms Execute time = 0ms ок спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:10 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Спасибо всем большое. Буду использовать и рекурсию, и WHILE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:13 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
сделал 2 выборки из главной таблицы (1475 записей) очень грубо, конечно, результаты: select full_region from table1 и select full_type from table1 1. с использованием WHILE План PLAN (TYPES INDEX (PK_TYPES))(TYPES INDEX (PK_TYPES)) PLAN (A NATURAL) ------ Performance info ------ Prepare time = 31ms Execute time = 0ms Avg fetch time = 0,00 ms Current memory = 9 809 144 Max memory = 9 849 408 Memory buffers = 2 048 Reads from disk to cache = 106 Writes from cache to disk = 0 Fetches from cache = 2 077 2. с использованием рекурсии План PLAN SORT ((T R REGIONS INDEX (PK_REGIONS)) PLAN (T R REGIONS INDEX (PK_REGIONS))) PLAN (A NATURAL) ------ Performance info ------ Prepare time = 16ms Execute time = 0ms Avg fetch time = 0,00 ms Current memory = 9 852 880 Max memory = 9 889 056 Memory buffers = 2 048 Reads from disk to cache = 9 Writes from cache to disk = 0 Fetches from cache = 2 497 с рекурсией быстрее в таблице REGIONS глубина больше в 2 - 3 раза и записей на много больше, чем в таблице TYPES ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:27 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11исправил Как-то ты уж больно сложно исправил... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Ты же, надеюсь, не собираешься скармливать этой процедуре ID-ы несуществующих записей, PARENT имеет FK на ID и NAME у тебя объявлено как NOT NULL... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:31 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11, у рекурсии перед WHILE один недостаток она ограничена глубиной 1023. Ну обычно этого хватает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:32 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovТы же, надеюсь, не собираешься скармливать этой процедуре ID-ы несуществующих записей, Я добавил в начало процедуры Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:44 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovPARENT имеет FK на ID такого нету надо добавить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:46 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Симонов ДенисX11, у рекурсии перед WHILE один недостаток она ограничена глубиной 1023. Ну обычно этого хватает ну такого количества 146% не будет, максимум до 10 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:48 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11Dimitry SibiryakovPARENT имеет FK на ID такого нету надо добавить Эх... Сразу-же про индексы спросил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 11:51 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Для поля PARENT индекс есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 13:12 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11, поскольку у тебя PARENT NOT NULL, то для добавления FK есть одна проблемка. Грубо говоря тебе придётся ввести корневую запись с ID 0. И в конце зациклить её на самой себя. Или же просто снять ограничение NOT NULL тогда FK добавить будет проще, но возможно придётся в других местах переделывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 13:18 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
X11Dimitry SibiryakovPARENT имеет FK на ID такого нету надо добавитьЭто надо сделать обязательно. А для построения цепочки нет необходимости в рекурсии, только движение вверх по цепочке parent-ов, и добавка новых имен "слева". В псевдокоде: 1. Задано - ID начальное 2. Устанавливаем начальные значения: PATH результат = '' - пустая строка, но не NULL ID текущее = ID начальное 3. В цикле: WHILE <ID текущее не есть корневое> DO begin - находим PARENT и NАМЕ текущего ID и записываем в PARENT текущее, NAME текущее - добавляем слева: PATH результат = NAME текущее + '->' + PATH результат - ID текущее = PARENT текущее // движение "вверх" end 4. Условие в WHILE не пропускает ID корневое, Поэтому, после окончания цикла находим NAME текущее от последнего найденного PARENT текущее (которое - корень) и добавляем в начало PATH результат. 5. убираем самую правую стрелку в результате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2015, 15:57 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
У меня есть табличка с подобным деревом. Материализованный путь там строится вот таким образом: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Если заменить в этом запросе имя моей таблички SYMPTOMS на REGIONS , имена полей PARENT_ID и TITLE_EN на PARENT и NAME соответственно, то получится именно то, о чём тут просят. И вроде бы без прохода по всей базе. Ну и номер 11742 нужно заменить на параметр. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2015, 14:26 |
|
||
|
Построить текстовую цепочку из дерева
|
|||
|---|---|---|---|
|
#18+
Tonal, это тоже самое что привёл я. Просто записано несколько в другом виде ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2015, 14:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=40&tid=1562878]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 316ms |

| 0 / 0 |
