|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW Еще раз спасибо, именно то что нужно было бы, если бы не не постоянные ID. Но идея великолепная! Код в моем примере дает постоянные ID и не требует unpivot, аналитику, итд. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 18:17 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SY Код в моем примере дает постоянные ID и не требует unpivot, аналитику, итд. Но у меня есть сомнения в по поводу постоянности ID. Плоская таблица каждый день создается наново. Я там ничего хранить не могу, я только ее читаю как есть. Насколько я понимаю, обеспечить постоянство ID можно только сравнивая плоскую таблицу с иерархической. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 19:10 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Sayan Malakshinov При большом объёме обычно как раз оптимизируют путем создания плоских мвьюх по иерархическим таблицам И меня не получалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2021, 21:02 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW Но у меня есть сомнения в по поводу постоянности ID. Плоская таблица каждый день создается наново. Я там ничего хранить не могу, я только ее читаю как есть. Т.е. плоская таблица каждый день создается наново a иерархическая нет? Если да, то я бы вместо HIERARCHY_ID, VERSION как в моем примере добавил бы HIERARCHY_HASH в обе таблицы и заполнял это поле через DBMS_CRYPTO.HASH хешируя NAME1 || '|' || NAME || '|' || NAME3... ( если | может встречаться в NAME то замени | на символ который встречаться не может). Таким образом ты получишь постоянные ID для той-же самой иерархии. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 00:34 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Elic Sayan Malakshinov При большом объёме обычно как раз оптимизируют путем создания плоских мвьюх по иерархическим таблицам И меня не получалось. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 02:04 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Sayan Malakshinov к сожалению, нет, тк on commit требует выполнения условий для fast refreshable, а connect-by в этом списке ограничений Почему-же? Простое в лоб MV дает и fast refresh и on commit. Все что нам нужно знать это max возможную глубину иерархии. Например 4 для таблицы EMP: Код: 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. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151.
Конечно self-join таблицы max возможная глубина иерархия раз не шашечки, но едет. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 03:11 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SY Все что нам нужно знать это max возможную глубину иерархии. Более того, connect by размножает строки, например для получения прямых связей: Код: plsql 1. 2. 3. 4. 5. 6. 7.
SY Конечно self-join таблицы max возможная глубина иерархия раз не шашечки, но едет. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 07:46 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SY Почему-же? Простое в лоб MV дает и fast refresh и on commit. Все что нам нужно знать это max возможную глубину иерархии. Например 4 для таблицы EMP: Обычно делается что-то типа такого: Код: 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.
Что это дает:
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
мы получим: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
А при попытке вставить элемент более глубокого уровня получим ошибку: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Полный скрипт для тестов тут: https://gist.github.com/xtender/7d2449f3132624bf4b2819a4a4c01c87 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 09:33 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SY Т.е. плоская таблица каждый день создается наново a иерархическая нет? SY DBMS_CRYPTO.HASH хешируя NAME1 || '|' || NAME || '|' || NAME3... Думаю, это ничего не даст. Мне нужно не ID всей строки, а ID Name1, ID - Name2 (с учетом родителя), ... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 12:35 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW Мне нужно не ID всей строки, а ID Name1, ID - Name2 (с учетом родителя), ... Вы б привели пример Вашей плоской таблицы, напр для emp.ename, плоская таблица выглядит ... зы если "ID" символьное, не поможет .... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 12:55 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Stax Вы б привели пример Вашей плоской таблицы, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 13:10 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
Еще раз спасибо всем за помощь! Свою задачу с вашей помощью я решил. Кратко: 1. Сделал View V_FH на основе запроса Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
2. Удаление через временную таблицу Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
3. Обновление для каждого уровня отдельно 3.1 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
3.2 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
3.3 ... Написал пост и понял, что PID в View не нужен. Можно без этого поля обойтись. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 13:37 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW, Создаем таблицы: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Заполняем плоскую: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
В иерархию добавляем только новое: Код: 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.
Имеем: Код: 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.
Удаляем все из плоской и заполняем тем-же плюс новая иерархия: Код: 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.
Выполняем NERGE: Код: 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.
Имеем: Код: 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.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 15:26 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SY, Спасибо! Интересное решение, но есть несколько но. 1. Оно более сложно для восприятия, понимания, по крайней мере для меня, и, соответственно, мне или другим будет сложнее его поддерживать. Даже несмотря на то, что оно может быть более универсальное и содержать меньше кода. Возможно, это субъективное мнение потому, что не я создавал этот код. 2. Отсутствует удаление записей, которых нет в плоской таблице. 3. ID не уникальное. То есть, выборки по ID или по PID будут проблематичны. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 17:44 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SergiiW SY, Спасибо! Интересное решение, но есть несколько но. 1. Оно более сложно для восприятия, понимания, по крайней мере для меня, и, соответственно, мне или другим будет сложнее его поддерживать. Даже несмотря на то, что оно может быть более универсальное и содержать меньше кода. Возможно, это субъективное мнение потому, что не я создавал этот код. 2. Отсутствует удаление записей, которых нет в плоской таблице. 3. ID не уникальное. То есть, выборки по ID или по PID будут проблематичны. 1. Все что используется в решении это хеш имен для проверки есть ли в HIERARCHICAL такая иерархия и самый обыкновенный MERGE так-что даже если у тебя с этим сложности то другим не будет сложнее его поддерживать разве-что они тоже entry level. 2. Ну так добавь это в MERGE или просто выполни Код: plsql 1. 2. 3. 4. 5. 6.
3. Все ID/PID уникальные в пределах иерархии. Сколько бы раз мы бы ни создавали иерархию из той-же плоской 'MISHA', 'MASHA', 'PASHA', NULL, 'GOSHA','KESHA' всегда MISHA получит ID = 1 а GOSHA получит ID = 5. Кроме того ID/PID это artificial key и привязка к нему превращает их в natural keys. Зачем привязываться к ID/PID если у нас есть имена? Приведи пример (словами) что ищется в таблице HIERARCHICAL. Например, найти непосредственных родителей Васи во всех иерархиях. SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 19:50 |
|
Плоскую таблицу преобразовать в Иерархическую
|
|||
---|---|---|---|
#18+
SY, ORA-00904: "DBMS_CRYPTO"."HASH": invalid identifier ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2021, 21:52 |
|
|
start [/forum/topic.php?fid=52&msg=40121781&tid=1879660]: |
0ms |
get settings: |
29ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
426ms |
get tp. blocked users: |
2ms |
others: | 18ms |
total: | 551ms |
0 / 0 |