Иерархический запрос Oracle - PullRequest
4 голосов
/ 25 января 2010

У меня есть таблица, которая содержит иерархию компаний. Было решено использовать этот плоский стол, поскольку в компании нет определенного количества уровней. Таблица отлично работает, и если вы используете каскадные списки на клиенте, то это прекрасно. Тем не менее, мне нужно увидеть «раздел» и все остальные «разделы», принадлежащие ему. Надеемся, что приведенная ниже информация даст вам представление о том, что мне нужно сделать.

Таблица Def

create table SECTION
(
  SECTION_ID       NUMBER(38) not null,
  SECTION_NAME     VARCHAR2(75) not null,
  SECTION_MANAGER  NUMBER(6) not null,
  SECTION_LEVEL    NUMBER(3) not null,
  OWNER_SECTION_ID NUMBER(38)
)

Данные

1   IT                    901763    2   0
2   Business Systems             904241 3   1
3   Business Analysis            900813 4   2
4   Development          900976 4   2
5   Testing                   907052    4   2
6   Systems Architecture    908012  4   2
7   Mobilisation             904241 4   2
8   Operations           900885 2   0
9   Area 2                    900456    3   8
0   Executive                          1    0   0

Что мне нужно увидеть

0   Executive                          1    8   Operations
0   Executive                          1    1   IT
0   Executive                          1    0   Executive
0   Executive                          1    2   Business Systems
0   Executive                          1    7   Mobilisation
0   Executive                          1    6   Systems Architecture
0   Executive                          1    4   Development
0   Executive                          1    3   Business Analysis
0   Executive                          1    5   Testing
0   Executive                          1    9    Area 2
1   IT                    901763    2   Business Systems
1   IT                    901763    7   Mobilisation
1   IT                    901763    6   Systems Architecture
1   IT                    901763    4   Development
1   IT                    901763    3   Business Analysis
1   IT                    901763    5   Testing
2   Business Systems             904241 7   Mobilisation
2   Business Systems             904241 6   Systems Architecture
2   Business Systems             904241 4   Development
2   Business Systems             904241 3   Business Analysis
2   Business Systems             904241 5   Testing
8   Operations           900885 9    Area 2
7   Mobilisation             904241     
6   Systems Architecture    908012      
4   Development          900976     
3   Business Analysis            900813     
5   Testing                   907052        
9    Area 2                   900456

Я мог бы сделать это в C # на стороне клиента, но мне бы очень хотелось иметь это как представление для базы данных.

Может кто-нибудь, пожалуйста, помогите мне с этим. Это вообще возможно?

Если вам нужно что-то разъяснить, пожалуйста, оставьте комментарий, и я постараюсь предоставить больше информации.

Ответы [ 2 ]

3 голосов
/ 25 января 2010

Это решение дает результат, который напоминает результат, указанный в описании проблемы.

select
    connect_by_root section_id section_id,
    connect_by_root section_name section_name,
    connect_by_root section_manager section_manager,
    section_id subsection_id,
    section_name subsection_name
from
    section
connect by nocycle
    prior section_id = owner_section_id

Запрошенное решение генерирует 28 строк при выполнении с образцами данных.

Обратите внимание, что в примере выборки Executive отображается как подраздел, а IT, Business Systems и Operations (которые, как и Executive, также имеют другие подразделы), не имеют. Это решение создает 3 дополнительные строки.

Кроме того, обратите внимание, что Executive является его собственным владельцем. Я считаю, что циклы не должны быть разрешены в графе, если зло, которое они подвергают нас, не является наиболее разумным способом достижения некоторой требуемой функциональности. Если в графике такого цикла не было, ключевое слово nocycle в запросе следует исключить.

1 голос
/ 25 января 2010

Да, это возможно. Вам нужно использовать синтаксис Oracle CONNECT BY. См. Здесь . Извините за то, что не поделился SQL, поскольку я сам не могу его проверить.

...