考虑一个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上的。
答案 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;
不确定它是否是最有效的方法,但它足够快。