|
|
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Есть Таблица TreeTable с Иерархической ( древовидной ) структурой элементов любой глубины вложенности ( для каждого элемента глубина вложенности может быть разная ) TreeTable состоит из 3-х полей : < пример иерархического элемента в таблице > : Id(уникальный) Name ParentId ----------------------------------------------------- IdГр_1 Гр_1 <Пусто для головного> IdГр_2 Пгр_2 IdГр_1 IdГр_3 Пгр_3 IdГр_2 ... IdГр_N Пгр_N IdГр_N-1 Нужно из такой таблицы построить такой SELECT , который бы вытягивал в строчку поля Пгр1, Пгр2, Пгр3, .... ПгрN таблицы TreeTable. для заданного Id=TaskId , т.е. получить таблицу вида : Id , Gr1, Gr2, Gr3, .... GrN --------------------------- где Gr1, Gr2, Gr3, .... GrN ряд имен полей соответсвующих Пгр1, Пгр2, Пгр3, .... ПгрN . Некоторые поля из Gr1...GrN будут незаполнены, т.к. глубина вложенности элементов в TreeTable разная , N - соответствует максимальной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:03:48 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Да, может забыл, надо еще один столбец в исходной TreeTable придумать DeepLevel - номер глубины вложенности чтобы в результирующей расположить Gr1,Gr2,...GrN по своим глубинам вложенности ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:21:22 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Вообще это один из вариантов реализации гибкой древовидной структуры, но возможно, что труднообрабатываемый ; может кто предложит другой - более легко обрабатываемый , но нужны такие же гибкие возможности. Может нужно применять объекты ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:36:06 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Выражение SQL можно построить следующим образом: SELECT <список полей> FROM Table INNER JOIN Table Parent1 on Table.ParentID = Parent1.ID INNER JOIN Table Parent2 on Parent1.ParentID = Parent2.ID ... INNER JOIN Table ParentN on ParentN-1.ParentID =ParentN.ID Короче, суть в том что ты джойнишь таблицу саму к себе, присваивая ей разные алиасы. Надеюсь я тебе хоть чем-то помог. Кстати, очень интересно, а какого рода информация хранится у тебя в этой древовидной таблице. Просто дело в том, что я сейчас тоже занимаюсь разработкой подобных вещей. Если есть немного времени, можно связаться и обсудить. С уважением, Волоцкой Дмитрий, ICQ 312454045 mailto:DVolotskoi@bisoft.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 16:40:06 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
2 Devel: так во-первых: в программе на стадии построения запроса неизвестно число полей - глубина вложенности и следовательно нельзя жестко записать запрос - его структура динамическая в зависимости от деревянного элемента и потом, что такое Parent1,Parent2,... У меня в исходной таблице TreeTable только три (c DeepLevel - четыре ) поля ; давай пользоваться моими именами во-вторых : Задача - то очень естественная - на моем предприятии выпускаемую продукцию глассифицируют по : группам, подгруппам, подподгруппам, и т.д. Причем данный ассортимент (конкретный экземпляр , ну, скажем булочка "Маковая" ) не обязательно должен находиться на самой нижней ступени иерархии в классификационной структуре, его могут запихнуть и на высшие уровни, Причем время от времени решают , что неплохо бы отнести этот экземпляр вообще к другой группе. Ну, в общем, как на сайтах переносят логические разделы из одной темы в другую, полагая, что в новой он более правильно будет находиться или , скажем, классифицируют насекомых, вначале ,скажем , относили их к парнокопытным и вполне были этим довольны , а потом , решили, что правильнее их в разряде чешуйчатокрылых рассматривать, ну, в общем , примеров-то куча... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 17:07:36 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Если уровень вложенности произвольный то одним SELECTом в общем случае никак. Единственное, можно взять количество уровней вложенности с запасом, тогда будет работать. Parent1,Parent2, это алиасы (пользовательские имена) твой таблицы, как нетрудно было догадаться по тому месту, которое они занимают в SQL запросе. Parent переводится как родитель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 17:34:26 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Кстати, если знаешь, подскажи пожалуйста, можно ли где-нибудь еще посмотреть информацию по древовидным таблицам. Я тут собираюсь по ним небольшую работу написать. Еще по поводу выборки. Есть универсальный способ - написать хранимую процедуру, которая бы получала максимальный уровень вложенности, формировала бы SQL выражение и выполняла бы его. Но это я рассказываю в терминах MS SQL сервер. Ну а в Oracle уж какой-нибудь подобный инструмент тем более должен быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 17:43:19 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Посмотри доку по иерархическим запросам вида Код: plaintext 1. одним запросом можно получить всю структуру дерева ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 17:46:32 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
2 Devel : Ну в алиасы я не въехал, так как они здесь , я не понял с какого боку - надо , если связывать , то по TreeTable.Id=TreeTable.ParentId, хоть в MS_SQL, хоть где, а в процедуре приходит на ум только курсорная позаписная обработка - а это не хотелось-бы ... 2 Speaker : > select ... from ... start with ... connect by ... > одним запросом можно получить всю структуру дерева Это круто, если , конечно это то, что я хочу - посмотрю ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 17:54:24 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
2 Speaker: select ... from ... start with ... connect by ... will show the hierarchy, however it will display one node per row. What yuniki is looking is the whole hierarchy in one row. In general, it is not possible since SELECT can not have more that 1000 elements in select list. If you know that hierarchy depth will not exceed 1000, you could: Код: plaintext 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. Obvioulsy, you would have to add as many elements to select list as your max hierarchy depth. SY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 18:07:13 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
2 SY : большое спасибо, Пока я полностью не догнал этот пример, но вижу , что требуется жесткое указание максимального количества полей в запросе ( as many elements to select list as your max hierarchy depth ) А если я не хочу ограничиваться заданием этой самой "max hierarchy depth", т.е. считаю ее наперед неизвестной, то - никак не построить запрос ? Я в Oracle недавно, помню в MS-Access (прошу прощения за упоминание) есть возможность повернуть таблицу вокруг оси с группированием по поворачиваемым полям : фраза TRANSORM ... SELECT .... PIVOT TABLE Тогда данные (любое наперед не известное их число в исходной таблице ) превращаются в поля результирующей таблицы Нет ли такой фичи в Oracle ? Да и еще небольшая фишка - как быть , если в исходной деревянной таблице есть еще один столбик - LeafId, где сущность листа берется из другой таблицы и в результирующем запросе надо в каждой строчке показать этот LeafId. Т.е. , по сути положить LeafId в свой раздел . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2003, 18:35:43 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
2 SY: еще раз спасибо, вроде догнал. И еще вопрос не такой глупый как предыдущий - при насколько мощном множестве эффективно использовать такие структуры. Есть ли опыт использования такой обработки при огромном (на Ваше усмотрение) числе записей исходной таблицы , если , при этом требуется малое время отклика , Просто волнует - нормально ли этот механизм принять как стандартный способ организации иерархических структур в Oracle или он гораздо медленнее жестко связаных иерархических структур , состоящих из нескольких таблиц ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2003, 00:09:31 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
I do not have experience with large hierarchical tables. But here we are using them in quite complex security logic (someway mimicking Oracle security). We have application users and application groups. Application users can be assigned to application groups. Apllication group can be assigned to another group, and so on and so forth. Application privileges can be granted roles. Roles can be granted no other roles, users or user groups. It is all stored as hierarchies. Number of rows does not exceed 10000. Hierarchical queries work quite fast. However most users have on average 2 to 3 roles and are members of no more that 5 groups, so data volume is really light. Since, as far as I know, hierarchical queries are sort based you might need large sort area size. SY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2003, 00:43:11 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Еще попробую спросить : а нельзя ли в приведенном примере перепостроить запрос так , чтобы выбрать максимальное число полей ( в примере оно = 4, но в зависимости от работы с таблицей Emp может меняться ) , а не жестко заданое запросом = 9 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2003, 12:34:08 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
You would have to use dynamic SQL: Код: plaintext 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. Then, if you are on 8i you would: Код: plaintext 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. And in 9i you could either use the above syntax or: Код: plaintext 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. SY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2003, 17:06:44 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Замечательно, большое спасибо! Интересно а нельзя каким-ни подзапросом здесь обойтись , без помощи динамического SQL . Да, и , если не секрет , какие вообще основные инструменты для Oracle разработки Вы используете ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2003, 18:36:41 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
> Интересно а нельзя каким-ни подзапросом здесь обойтись , без помощи > динамического SQL . I do not think you can avoid dynamic SQL. > Да, и , если не секрет , какие вообще основные инструменты для Oracle > разработки Вы используете ? Well, I am a DBA and therefore I do not write code. I had to learn PL/SQL to deal with developers always complaining "it was working yeasterday, what did you change" or "it was fast yesterday, what did you change". I use TOAD and SQL*Plus for light coding and TKPROF for query tuning. SY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2003, 21:40:34 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
2 SY: > I do not have experience with large hierarchical tables. But here we are using > them in quite complex security logic (someway mimicking Oracle security). ... Извините за офтоп, но сейчас мы только начинаем переход на Oracle ( пытаясь пока по малому - только вывести отчеты из старой системы через Oracle ) ; но сразу хотелось бы понять основные правила построения архитектуры построения приложения. Как Вы реализуете упомянутые Вами приложения , группы приложений, пользователей ( ну , пользователи, видимо , это и есть USERS в Oracle ) и раздаете им права. Пока у нас даже с организацией простейшей системы отчетов выходят заморочки. Мы , скажем хотели бы, чтобы в схеме <Отчеты по Реализации> разработчик <ИвановИИ> имел все права содавать любые объекты : таблицы, вью, процедуры и т.д. , необходимые для разрабатываемых им отчетов, а сама схема <Отчеты по Реализации> могла иметь право селектить из других схем, где лежат таблицы с исходными данными. Может это принципиально невозможно в Oracle, но хотелось бы как то логично с точки зрения отчетов смоделировать разработку отчетов с помощью объектов базы Oracle. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2003, 11:34:46 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
>SY It's cool! >yuniki Вообще-то иерархические запросы существуют для того, чтобы отображать клиенту сущности в иерархическом виде, при этом перемещения "булочек" из папки в папку выполняется мышкой, как в Explorer. Отображение иерархии в виде таблицы мягко говоря озадачивает. Если Вы хотите, чтобы Ваши "булочки" отличались от "групп" и в иерархическом представлении "булочку" в "булки" перетащить можно было бы, а наоборот - нет, Вам придётся ввести в Вашу иерархическую таблицу дополнительное поле типа "IS_FOLDER CHAR(1) DEFAULT 'Y' CHECK (IS_FOLDER IN('Y','N'))" и добавить поддержку этого поля в клиентской программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2003, 14:20:17 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
2 EthernalWonderer: Спасибо за совет, но , чувствуя недоумение , поясню , что это нужно для отчетов ( особенно OLAP подобных ) А касательно перемещения узла булок в лист булочка - так это просто наш лист вырастает в ветку - была булочка, а стала булочка такая и сякая, но это опять же уже касается той обработки дерева, которую я здесь не затрагиваю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2003, 17:35:28 |
|
||
|
Как в Oracle сделать выборку из древовидной таблицы
|
|||
|---|---|---|---|
|
#18+
Вставлю 3 копейки, если позволите. Все рекурсивные запросы, как и CONNECT BY, работают очень медленно, по сути. Поэтому если вы действительно пишете рабочую систему, а не один раз SELECT сделать, я рекомендую вам почитать немного литературы по этому поводу, очень красивые идеи. http://sdm.viptop.ru/articles/sqltrees.html http://www.osp.ru/win2000/sql/2001/05/967.htm http://rdbms.narod.ru/article/tree/index.html Особенно рекомендую последнюю ссылку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2003, 18:34:44 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32180816&tid=1990074]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
181ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 198ms |
| total: | 468ms |

| 0 / 0 |
