У меня есть простое трехуровневое дерево, в настоящее время сохраненное в виде списка смежности:
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 (хотя мне любопытно, как этот будет выглядеть).
Какой правильный способ сделать это?