postgresql树状结构查询示例
- 创建一张表 TREE_TEST,表中包含三个字段:ID、NAME 和 PARENT_ID。其中,ID 是主键,NAME 用于存储节点名称,PARENT_ID 用于存储父节点的 ID。
CREATE TABLE TREE_TEST (
ID INTEGER PRIMARY KEY,
NAME VARCHAR(32),
PARENT_ID INTEGER REFERENCES TREE_TEST(ID)
);
- 插入几条测试数据。例如,插入以下数据:
INSERT INTO TREE_TEST(ID, NAME, PARENT_ID) VALUES(1, 'TREE_1', NULL);
INSERT INTO TREE_TEST(ID, NAME, PARENT_ID) VALUES(11, 'TREE_11', 1);
INSERT INTO TREE_TEST(ID, NAME, PARENT_ID) VALUES(12, 'TREE_12', 1);
这样就创建了一个简单的树状结构,根节点是 TREE_1,它有两个子节点 TREE_11 和 TREE_12。
- 执行树状结构查询。例如,要查询根节点为 TREE_1 的整个树结构,可以使用递归查询语句:
WITH RECURSIVE tree_path (id, name, parent_id, path) AS (
SELECT id, name, parent_id, name
FROM TREE_TEST
WHERE name = 'TREE_1'
UNION ALL
SELECT t.id, t.name, t.parent_id, tp.path || '->' || t.name
FROM TREE_TEST t
JOIN tree_path tp ON t.parent_id = tp.id
)
SELECT * FROM tree_path;
- 这个查询语句会返回一个包含树中所有节点及其路径的列表。在这个例子中,它会返回以下结果:
id | name | parent_id | path |
---|-------|----------|--------------------------|
1 | TREE_1 | NULL | TREE_1 |
11 | TREE_11 | 1 | TREE_1->TREE_11 |
12 | TREE_12 | 1 | TREE_1->TREE_12 |
over~~