powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как задать иерархию по двум ветвям?
5 сообщений из 5, страница 1 из 1
Как задать иерархию по двум ветвям?
    #32162467
Diman!?!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим, есть таблица

Create table Animals (id_Animal number(5) primary key,
Mother number(5),
Father number(5));
Mother и Father являются первичными ключами животных.
Как построить иерархических запрос для просмотра всех родственников по материнской и отцовской ветке?
...
Рейтинг: 0 / 0
Как задать иерархию по двум ветвям?
    #32162533
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
This will give you complete hierarchy:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT  LPAD(' ', 2  * LEVEL) || ID_ANIMAL
  FROM  ANIMALS
  START WITH    ID_MOTHER IS NULL
             OR
                ID_FATHER IS NULL
  CONNECT BY    PRIOR ID_ANIMAL = ID_FATHER
             OR
                PRIOR ID_ANIMAL = ID_MOTHER
/


To get all relatives of a specific animal, you would have to combine two queries: ascendants (parents, grandparents, etc.) and descendants (children, grandchildren, etc.):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 SELECT  -(LEVEL -  1 ) GENERATION,
         ID_ANIMAL
   FROM  ANIMALS
   START WITH ID_ANIMAL = some_id
   CONNECT BY ID_ANIMAL = PRIOR ID_FATHER
                 OR ID_ANIMAL = ID_MOTHER
UNION
 SELECT  LEVEL -  1  GENERATION,
         ID_ANIMAL
   FROM  ANIMALS
   START WITH ID_ANIMAL = some_id
   CONNECT BY PRIOR ID_ANIMAL = ID_FATHER
                 OR ID_ANIMAL = ID_MOTHER
/


You can even:

Код: 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.
SELECT  GENERATION,
        NAME
  FROM  (
          SELECT  DECODE(
                         LEVEL,
                          1 ,'Self',
                          2 ,'Parent',
                          3 ,'Grandparent',
                         LPAD('Great ',(LEVEL - 3 ) *  5 ,'Great ') || 'Grandparent'
                        ) GENERATION,
                  ID_ANIMAL
            FROM  ANIMALS
            START WITH ID_ANIMAL = some_id
            CONNECT BY    ID_ANIMAL = PRIOR ID_FATHER
                       OR
                          ID_ANIMAL = PRIOR ID_MOTHER
         UNION
          SELECT  DECODE(
                         LEVEL,
                          1 ,'Self',
                          2 ,'Child',
                          3 ,'Grandchild',
                         LPAD('Great ',(LEVEL - 3 ) *  5 ,'Great ') || 'Grandchild'
                        ) GENERATION,
                  ID_ANIMAL
            FROM  ANIMALS
            START WITH ID_ANIMAL = some_id
            CONNECT BY    PRIOR ID_ANIMAL = ID_FATHER
                       OR
                          PRIOR ID_ANIMAL = ID_MOTHER
        )
ORDER BY LEVEL
/


SY
...
Рейтинг: 0 / 0
Как задать иерархию по двум ветвям?
    #32162534
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sorry, second query is missing keyword PRIOR. It should be:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
To get all relatives of a specific animal, you would have to combine two queries:
ascendants (parents, grandparents, etc.) and descendants (children, grandchildren, etc.): 

 SELECT  -(LEVEL -  1 ) GENERATION,
         ID_ANIMAL
   FROM  ANIMALS
   START WITH ID_ANIMAL = some_id
   CONNECT BY    ID_ANIMAL = PRIOR ID_FATHER
              OR
                 ID_ANIMAL = PRIOR ID_MOTHER
UNION
 SELECT  LEVEL -  1  GENERATION,
         ID_ANIMAL
   FROM  ANIMALS
   START WITH ID_ANIMAL = some_id
   CONNECT BY    PRIOR ID_ANIMAL = ID_FATHER
              OR 
                 PRIOR ID_ANIMAL = ID_MOTHER
/


SY
...
Рейтинг: 0 / 0
Как задать иерархию по двум ветвям?
    #32162589
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
All day I had I feeling there was something wrong with the third query I posted. And it just hit me that ORDER BY the way I use it will not work. It should be:

Код: 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.
SELECT  GENERATION,
        ID
  FROM  (
          SELECT  -(LEVEL -  1 ) LVL,
                  DECODE(
                         LEVEL,
                          1 ,'Self',
                          2 ,'Parent',
                          3 ,'Grandparent',
                         LPAD('Great ',(LEVEL - 3 ) *  6 ,'Great ') || 'Grandparent'
                        ) GENERATION,
                  ID_ANIMAL
            FROM  ANIMAL
            START WITH ID_ANIMAL = some-id
            CONNECT BY    ID_ANIMAL = PRIOR ID_FATHER
                       OR
                          ID_ANIMAL = PRIOR ID_MOTHER
         UNION
          SELECT  (LEVEL -  1 ) LVL,
                  DECODE(
                         LEVEL,
                          1 ,'Self',
                          2 ,'Child',
                          3 ,'Grandchild',
                         LPAD('Great ',(LEVEL - 3 ) *  6 ,'Great ') || 'Grandchild'
                        ) GENERATION,
                  ID_ANIMAL
            FROM  HIERARCHYX
            START WITH ID_ANIMAL = some-id
            CONNECT BY    PRIOR ID_ANIMAL = ID_FATHER
                       OR
                          PRIOR ID_ANIMAL = ID_MOTHER
        )
ORDER BY LVL
/


SY
...
Рейтинг: 0 / 0
Как задать иерархию по двум ветвям?
    #32162622
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по отдельности не пробовал два запроса в UION?
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как задать иерархию по двум ветвям?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]