У меня есть простое трехуровневое дерево, которое в настоящее время хранится в виде списка смежности:
CREATE TABLE categories (
id int,
name text,
parent_id int);
Он доступен только для чтения, и мне часто нужно знать корневую категорию любой данной категории. Поэтому я хочу добавить столбец root_id и сохранить его, чтобы избежать беспорядочных предложений WHERE, CTE и т. д.
Моя первая попытка была:
update categories set root_id = parent.id
from categories as child
join categories as parent
on child.parent_id = parent.id
and parent.parent_id is null;
Но UPDATE
не может работать с объединениями, создающими несколько строк . (Этот запрос был только для категорий уровня 2; я бы сделал аналогичный запрос для третьего уровня.)
Я знаю, что ответ включает в себя превращение соединения в подзапрос, но я не могу думать о самообъединениях и подзапросах одновременно. Мы используем PostgreSQL 9.0, поэтому у меня нет доступных для записи CTE (хотя мне любопытно, как это будет выглядеть).
Как правильно это сделать?