使用的PostgreSQL數據庫8.4.14,我有一個表代表一個樹狀結構類似於下面的示例:樹結構和遞歸
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', 1)
, (3, 'grandchild A', 2), (4, 'grandchild B', 2);
id | name | parent_id
----+--------------+-----------
1 | parent |
2 | child | 1
3 | grandchild A | 2
4 | grandchild B | 2
我要爲這些單位創建一個訪問控制列表,每個單元可能擁有自己的ACL,或者使用自己的ACL從最近的祖先繼承它。
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
---------
1
4
我使用視圖,以確定是否一個單元繼承它的ACL從一個祖先:
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
2 | t
3 | t
4 | f
我的問題是:我怎麼能得到最近的單元是不是從祖先繼承ACL?我預期的結果應類似於如下表/視圖:
unit_id | acl
---------+------------
1 | 1
2 | 1
3 | 1
4 | 4
+1非常好的問題。 As * always *,您的PostgreSQL版本應該包含在內。 –