0

MPTT(Modified Preorder Tree Traversal)メソッドを使用して階層データを格納するSQLテーブルについて考えてみます。

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上にあります。

4

1 に答える 1

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;

それを行うのに最も効率的な方法かどうかはわかりませんが、十分に高速です。

于 2010-08-11T09:25:29.270 に答える