Обновить все родительские идентификаторы в таблице SQL mptt

рассмотрим таблицу SQL, в которой иерархические данные хранятся с использованием MPTT (модифицированный предварительный заказ Обход дерева).

CREATE TABLE node (
    id              SERIAL          NOT NULL, -- primary key

    -- Nested mptt tree model.
    lft             INT             NOT NULL,
    rgt             INT             NOT NULL,

    -- Some legacy applications still need to access parent nodes using a foreign key
    parent_id       INT,

    FOREIGN KEY(parent_id) REFERENCES node
);

Теперь я хотел бы обновить все внешние ключи parent_id одновременно. К сожалению, мои навыки работы с SQL действительно заржавели. Может ли кто-нибудь указать мне эффективный способ сделать это?

Я так пробовал:

UPDATE node AS main 
SET main.parent_id=ss.id 
FROM (
    SELECT parent.id 
    FROM node AS parent 
    WHERE main.lft BETWEEN parent.lft AND parent.rgt
    ORDER BY parent.lft DESC) ss;

К сожалению, похоже, это не работает:

ОШИБКА: подзапрос в FROM не может ссылаться на другие отношения того же уровня запроса

Спасибо за любые подсказки.

PS: это на PostgreSQL, если это имеет значение.


person Haes    schedule 11.08.2010    source источник


Ответы (1)


Собственно, я нашел способ сделать это:

UPDATE node 
SET parent_id=ss.id 
FROM (
    SELECT id, lft, rgt 
    FROM node ORDER BY lft DESC) ss 
WHERE ss.lft < node.lft AND ss.rgt > node.rgt;

Не уверен, что это самый эффективный способ сделать это, но он достаточно быстрый.

person Haes    schedule 11.08.2010