Tree Structure 和Recursion
技术问答
228 人阅读
|
0 人回复
|
2023-09-12
|
使用 PostgreSQL 8.4.14 数据库,我有一个表示树结构,如下所示:
* p% b6 X& h9 V4 A3 P
B: |0 E9 U( `% j% p+ W. L- CREATE TABLE unit id bigint NOT NULL PRIMARY KEY, name varchar(64) NOT NULL, parent_id bigint, FOREIGN KEY (parent_id) REFERENCES unit (id));INSERT INTO unit VALUES (1,'parent',NULL),(2,'child grandchild A(、grandchild B',2); id | name | parent_id ---- -------------- ----------- 1 | parent | 2 | child | | grandchild A | | grandchild B | code]我想为这些单元创建一个访问控制列表,每个单元可能都有自己的 ACL,或者从最近的祖先那里继承,拥有自己的 ACL。
' U( ?7 v- V4 e - [code]CREATE TABLE acl unit_id bigint NOT NULL PRIMARY KEY, FOREIGN KEY (unit_id) REFERENCES unit (id));INSERT INTO acl VALUES (1),(4); unit_id --------- 4[//code]我正在用视图来确定一个单元是否从祖先那里继承了 ACL:[code]CREATE VIEW inheriting_acl AS SELECT u.id AS unit_id,COUNT(a.*) = 0 AS inheriting FROM unit AS u LEFT JOIN acl AS a ON a.unit_id = u.id GROUP BY u.id; unit_id | inheriting --------- ------------ 1 | f | t 3 | t 4 | f
6 z3 K; m& B4 P4 ~ 我的问题是:我怎样才能得到它?不从祖先那里继承 ACL最近的单位?我的预期结果应该类似于下表/视图:7 e$ p! [6 Z# E" X* v% R# G5 O
unit_id | acl --------- ------------ 1 | 1 2 | 1 3 3 3 3 3 3 | 1 4 4 4 4 | 4: }+ y9 J; O1 D* ^: N
4 A$ a2 o1 Z% E6 q9 F% e& O 解决方案: |
|
|
|
|
|