|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Добрий день! К сожалению ничего не нашел, может куда направите. :) Есть плоска таблица с полями Name1, Name2, Name3, Name4, Name5, Name6, ... Каждое поле Name это отдельный уровень. Нужно это преобразовать в иерархическую таблицу Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Сейчас я делаю для каждого уровня отдельный Insert. Сложность еще состоит в том, что некоторые уровни (Name{N}) могут быть пустыми, следовательно, этот уровень нужно пропустить при добавлении в HIERARCHICAL. В этом случае количество Insert-ов для следующих уровней увеличивается в 2 раза. Кроме того. Сейчас я удаляю все в HIERARCHICAL, а потом создаю наново, но это плохо. Мне нужны ID для дальнейшего использования, а они каждый раз при Insert будут (могут быть) разные. Конечно это тоже можно сделать Insert только новых и Delete отсутствующих, но это еще усложняет обновление HIERARCHICAL. Может будут какие-то идеи упрощения всего этого процесса? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 16:57 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiWМожет будут какие-то идеи упрощения всего этого процесса? Использовать PL/SQL для преобразования данных. Старую таблицу удалить чтобы этот процесс был одноразовым. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 17:02 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Спасибо! Буду думать как это решить на PL/SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 17:11 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW Есть плоска таблица с полями Name1, Name2, Name3, Name4, Name5, Name6, ... ... Может будут какие-то идеи упрощения всего этого процесса? Это если я правильно понял суть задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 17:16 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW Может будут какие-то идеи упрощения всего этого процесса? SergiiW Мне нужны ID для дальнейшего использования, а они каждый раз при Insert будут (могут быть) разные. Конечно это тоже можно сделать Insert только новых и Delete отсутствующих, но это еще усложняет обновление HIERARCHICAL. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 17:53 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Что-то типа такого нужно? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 20:40 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW Сложность еще состоит в том, что некоторые уровни (Name{N}) могут быть пустыми, следовательно, этот уровень нужно пропустить при добавлении в HIERARCHICAL. Не уверен что понял. Понял так: Name{N} пустой значит Name{N + 1} пустой и Name{N + 2} пустой и.т.д. ибо число полей плоской таблицы есть MAX(N). Код: 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. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 21:09 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Перемудрил. Все что нужно это пронумеровать строки плоской таблицы + LATERAL/CROSS APPLY: Код: 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. 47. 48. 49. 50. 51. 52. 53.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 21:37 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SY Перемудрил. Код: plsql 1.
Для сохранения id-шников нужен merge по пути. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2021, 23:09 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Elic Для сохранения id-шников нужен merge по пути. Не понял. Ты имеешь ввиду строки плоской таблицы связаны и Вася во всех строках плоской таблицы это один и тот-же Вася? SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 01:24 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
А, ты имеешь ввиду "Мне нужны ID для дальнейшего использования, а они каждый раз при Insert будут (могут быть) разные". Это решается добавлением уникального поля к плоской таблице вместо ROWNUM: Код: 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. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74.
Поскольку таблица не может иметь больше 1000 полей иерархия из плоской таблицы не может иметь более 1000 уровней. Так-что HIERARCHY_ID * 1000 до HIERARCHY_ID * 1000 + 999 покрывает все возможные уровни и гарантирует каждый раз при insert ID/PID не будут меняться. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 01:56 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#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. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128.
Добавим новую иерархию и изменим существующую: Код: 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. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 03:02 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW, А зачем вообще все это нужно? Вы же понимаете, что хоть плоская таблица и менее "гибкая", но более эффективная для получения родительских и дочерних узлов? Ну, и может проще вьюху тогда уж сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 03:38 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Спасибо всем за ответы! Не ожидал такого участия. :) Буду читать и анализировать. SY Не уверен что понял. Понял так: Name{N} пустой значит Name{N + 1} пустой и Name{N + 2} пустой и.т.д. Например если Name3 пусто, то Name4 будет связано с родителем Name2. Но нужно признать, что, на сегодня, только одно поле Name3 может быть пустое. Все остальные поля должны быть заполнены. Есть другие нюанси, которые я упустил. :( Количество записей 1-2 млн. Обновлять нужно каждый день. Sayan MalakshinovНу, и может проще вьюху тогда уж сделать? Нужно работать с деревом, а вьюха не будет достаточно быстрой для отображения в интерфейсе. По крайней мере, у меня ничего не получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 08:04 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW, Иерархическая таблица обычно в разы, а иногда и на порядки хуже для работы с деревьями, например при указанной высоте 6 для получения предков получится минимум 12 логических чтений (6 раз индекс + 6 к таблице), а с плоской всего 2. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 08:28 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
При большом объёме обычно как раз оптимизируют путем создания плоских мвьюх по иерархическим таблицам ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 08:30 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Sayan Malakshinov, Мне нужно идти от родителя. Для иерархический это просто. Код: plsql 1.
это, обычно, 5-20 записей. Для плоской нужно указывать всех родителей. Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 11:50 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiWДля плоской нужно указывать всех родителей. У вас реально задача на поиск всех поддеревьев с заданным именем? Даже с указанием всех родителей и индексом на каждое поле это всё равно получается быстрее и проще, чем в иерархии. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 14:11 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW Sayan Malakshinov, Мне нужно идти от родителя. Для иерархический это просто. Код: plsql 1.
это, обычно, 5-20 записей. Для плоской нужно указывать всех родителей. Код: plsql 1.
ID, LVL, NAME, LVL0, LVL1, LVL2, LVL3, LVL4, LVL5, LVL6, LVL7, LVL8, LVL9 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 14:41 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Даже с указанием всех родителей и индексом на каждое поле это всё равно получается быстрее и проще, чем в иерархии. Я даже возразить ничего не могу, так как для меня очевидно, что иерархическая таблица во много раз проще и быстрее. Для нее нужно указать только PID, а для плоской всех родителей в текстовом виде. Реально у меня быстродействие на несколько порядков больше. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 16:07 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Sayan Malakshinov у вас какая-то странная и непонятная плоская таблица ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 16:08 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiWЯ даже возразить ничего не могу, так как для меня очевидно, что иерархическая таблица во много раз проще и быстрее. А для некоторых очевидно, что солнце вращается вокруг плоской земли... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 16:09 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Никанор Кузьмич Я бы сделал примерно так: unpivot + rownumber(), потом отсортировать по какому-нибудь старому полю + NameN, rownumber() становится id, rownumber() предыдущей строки использовать как parent_id. Вроде относительно просто. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 16:16 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Elic RTFM MERGE ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 16:24 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Никанор Кузьмич Что-то типа такого нужно? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 16:35 |
|
|
start [/forum/topic.php?fid=52&msg=40121395&tid=1879660]: |
0ms |
get settings: |
15ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
24ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
531ms |
get tp. blocked users: |
0ms |
others: | 309ms |
total: | 890ms |
0 / 0 |