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

Create table Animals (id_Animal number(5) primary key,
Mother number(5),
Father number(5));
Mother и Father являются первичными ключами животных.
Как построить иерархических запрос для просмотра всех родственников по материнской и отцовской ветке?
...
Рейтинг: 0 / 0
18.05.2003, 19:44
    #32162533
SY
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
18.05.2003, 19:49
    #32162534
SY
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
19.05.2003, 03:42
    #32162589
SY
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
19.05.2003, 08:44
    #32162622
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как задать иерархию по двум ветвям?
А по отдельности не пробовал два запроса в UION?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как задать иерархию по двум ветвям? / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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