Нельзя выполнить 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
Добавление дополнительного столбца с избыточными данными усложнит изменение ваших данных, поскольку вам всегда придется обновлять родительский элемент при добавлении / удалении дочерних элементов.