Процедура для изменения и обновления таблицы иерархических отношений, чтобы увидеть, есть ли дочерние - PullRequest
0 голосов
/ 18 марта 2010

У меня есть иерархическая таблица на Oracle pl / sql. что-то вроде:

create table hierarchical (
   id             integer primary key,
   parent_id          references hierarchical ,
   name           varchar(100));

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

Можно ли выполнить изменение и обновление за одну процедуру? Любые примеры кода будут высоко оценены.

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

Нельзя выполнить ALTER TABLE ( DDL ) и UPDATE ( DML ) за один шаг.

Вам нужно будет сделать ALTER TABLE, а затем UPDATE.

BEGIN
  EXECUTE IMMEDIATE 'ALTER TABLE hierarchical ADD child_count INTEGER';
  --
  EXECUTE IMMEDIATE '
  UPDATE hierarchical h
  SET child_count = ( SELECT COUNT(*)
                      FROM hierarchical h2
                      WHERE h2.parent_id = h.id )';
END;

Подумайте дважды, прежде чем делать это. Теперь вы можете легко узнать, есть ли у id дочерние элементы с запросом.

Этот пример даст вам количество дочерних элементов всех верхних узлов, например:

SELECT h.id, h.name, COUNT(childs.id) child_count
FROM hierarchical h
LEFT JOIN hierarchical childs ON ( childs.parent_id = h.id )
WHERE h.parent_id IS NULL
GROUP BY h.id, h.name

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

0 голосов
/ 18 марта 2010

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

    select h.*, connect_by_isleaf as No_children_exist
      from hierarchical h
start with parent_id is null
connect by prior id = parent_id; 

CONNECT_BY_LEAF возвращает 0, если в строке есть дочерние элементы, и 1, если ее нет.

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

...