更新SQL mptt表中的所有父ID

时间:2010-08-11 08:36:54

标签: sql postgresql 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上的。

1 个答案:

答案 0 :(得分:0)

实际上,我找到了一种方法:

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;

不确定它是否是最有效的方法,但它足够快。