Иерархический запрос должен вытягивать детей, родителей и братьев и сестер

Теперь можно получить данные, но мне интересно, есть ли лучший способ оптимизировать запрос для больших наборов данных.

http://sqlfiddle.com/#!4/0ef0c/5

Итак, в основном я хочу иметь возможность предоставить запрос для данного идентификатора организации и заставить его рекурсивно вытягивать своих родителей, своих детей, своих братьев и сестер, а также своих теток и дядей. А затем извлеките любые действия, связанные с этой организационной иерархией.

Org1 — это организация верхнего уровня, но она может иметь или не иметь нулевого родительского элемента.

По сути, я выполнял запрос вверх и вниз, чтобы вытащить дочерние и родительские элементы, но, похоже, могу получить братьев и сестер, только добавив еще один запрос. Наконец-то с помощью друга добрался до другого запроса, но его очень мало для больших наборов данных (4-5 тыс. Активностей).

Мы будем очень признательны за любое понимание.


person Gabe Ortiz    schedule 01.12.2012    source источник
comment
Если вы потрудились создать скрипку, ссылка будет удобна.   -  person Laurence    schedule 01.12.2012
comment
Извини за это. sqlfiddle.com/#!4/5310d/5/0   -  person Gabe Ortiz    schedule 05.12.2012
comment
Да, это помогает быть ясным. Следовательно, это уже третий раз, когда вы добавляете новую информацию к тому, что хотите извлечь. Забудь это.   -  person REW    schedule 08.12.2012
comment
Выглядит интересно. Кому-то еще интересно?   -  person Andrew Wolfe    schedule 23.07.2014


Ответы (2)


Если ваша орг. структура строго иерархична, то можно использовать такой подход: http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html

Недостатком является то, что вы должны обновлять индекс при каждом обновлении организационной структуры. Однако организационные структуры обычно гораздо чаще читаются, чем модифицируются. Так что ИМХО должно помочь.

person Udo Klein    schedule 15.02.2013

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

CREATE OR REPLACE PROCEDURE find_parents( 
  org_id NUMBER, 
  lvl NUMBER DEFAULT 1) AS 

  c_parent table1.id%TYPE;
  c_name table1.name%TYPE;
  CURSOR c_parents (c_id table1.id%TYPE) IS
    SELECT parent, name FROM table1 WHERE (id = c_id);

  BEGIN
    dbms_output.put('-');
    OPEN c_parents(org_id);
    LOOP
      FETCH c_parents INTO c_parent, c_name;
      EXIT WHEN c_parents%notfound;
      dbms_output.put_line('Level ' || lvl || ' parent: [ID: ' || c_parent || ', NAME: ' || c_name || ']');
      find_parents(c_parent, lvl + 1);
    END LOOP;
    CLOSE c_parents;
  END;
person Derek    schedule 29.04.2014
comment
Это должно быть возможно в обычном иерархическом запросе - никаких процедур не требуется. - person Andrew Wolfe; 23.07.2014