|
|
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
Создать запрос для определения сумм окладов сотрудников от сотрудников, не имеющих менеджера (менеджеров высшего уровня), до сотрудников, не имеющих подчиненных. Исходная таблица(частично): employee_id, last_name, salary, manager_id - где столбец manager_id хранит id менеджера данного работника Пример результата: MAN_LIST SUM_SALKing->Kochhar->Greenberg->Faviet 62008… …King->Hartstein->Fay 43000 Решил вот так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Но понимаю, что это решение, только для данного случая. Хотелось бы его превратить в более универсальный вариант. По-моему, должно быть что-то вот такое (только такой запрос не хочет прекращать выполняться): Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Может кто-то что-то посоветует или конструктивно покритикует. Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 15:36 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
Забыл упомянуть. Решение должно быть без использования аналитических функций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 15:45 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
kuzeaопределения сумм окладов сотрудников от сотрудников, не имеющих менеджера (менеджеров высшего уровня), до сотрудников, не имеющих подчиненных.Формулировка - не ахти. kuzea Код: plsql 1. Зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 15:53 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
Elic, нужно вытащить все последовательности работников компании, такие в которых 1)первым должен быть самый главный у которого нет начальника (т.е. manager_id is null), 2)последним в каждой последовательности должен быть такой работник, который ни для кого не является руководителем, 3)а между ними работники в соответствии с иерархией компании. Например, главный King его замы - Korchhar, Ivanov у замов в отделах - у Korchhar(Pupkin, Sidorov), у Ivanov(Petrov). Тогда King->Korchhar->Pupkin King->Korchhar->Sidorov King->Ivanov->Petrov connect_by_isleaf = 1 нужно, чтобы оставить только те ветки иерархии, которые заканчиваются листьями(работниками не имеющими подчиненных в данном случае). Так исключаются ветки типа King->Ivanov ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 16:10 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
kuzea, Я что-то не понял если у сотрудников зарплата: King - 1000 Kochhar -100 Greenberg - 10 Faviet- 1 Hartstein - 200 Fay - 20 то King->Kochhar->Greenberg->Faviet = 1111 King->Hartstein->Fay = 1220 Так надо? т.е. учитываем зарплату King (например) в каждой строке где он участвует? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 16:37 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, да второй столбец - это сумма зарплат тех, чьи фамилии есть в цепочке в первом столбце ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 16:40 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
kuzea, без аналитических функций 1) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 2) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 17:10 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
booby, Както так наверно Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 17:28 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
kuzea, Упс, это как 2-й вариант предложенный booby ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 17:30 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
booby, MaximaXXL спасибо, через start with можно оказывается подзапрос связывать. не знал, теперь запомню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 17:49 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
а вот если по 2-ому варианту, я правильно понимаю? сначала отрабатывает основной запрос и вытаскивает цепочку man_list с условием connect by employee_id = prior manager_id (так получаем первую строку (точнее ее часть, столбец man_list) результирующего множества), а затем начиная с последнего элемента полученной цепочки отрабатывает подзапрос с условием connect by prior employee_id = manager_id и считает сумму зарплат как бы в обратном порядке (и выдает первую строку(столбец sal) результирующего множества). и так дальше, полстроки + полстроки = строка результата, пока всё не обработается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 18:27 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
kuzea, почти так. да, считает сумму подзапросом в "обратом порядке". Но для каждой строки исходного запроса. После чего ставится фильтр на листовые строки. Если надо, чтобы считало обратную последовательность только для листовых строк напиши например так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 21:18 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
kuzea, автор(и выдает первую строку(столбец sal) результирующего множества). здесь у подзапроса by design одна строка. Так работают агрегатные запросы без group by. После первой нет следующей и быть не может. А если внезапно, волею прокравшегося в систему таракана, вдруг образовалась бы вторая строка, то была бы получена ошибка времени выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2017, 21:23 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 07:55 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
Elic… Live SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 10:34 |
|
||
|
Задачка (иерархический запрос)
|
|||
|---|---|---|---|
|
#18+
kuzea, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Или, если установлен OLAP: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Код: 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2017, 14:50 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39508858&tid=1885369]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
156ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 438ms |

| 0 / 0 |
