Sử dụng một cơ sở dữ liệu PostgreSQL 8.4.14, tôi có một bảng đại diện cho một cấu trúc cây như ví dụ sau:Tree Cấu trúc và Đệ quy
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
Tôi muốn tạo một Access Control List cho những đơn vị, trong đó mỗi đơn vị có thể có ACL riêng của nó, hoặc kế thừa nó từ tổ tiên gần nhất với một ACL riêng.
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
Tôi đang sử dụng một cái nhìn để xác định xem một đơn vị được kế thừa đó là ACL từ một tổ tiên:
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
Câu hỏi của tôi là: làm thế nào tôi có thể nhận được đơn vị khu vực gần đó là KHÔNG kế thừa ACL từ một tổ tiên? Kết quả mong đợi của tôi trông giống như bảng/chế độ xem sau:
unit_id | acl
---------+------------
1 | 1
2 | 1
3 | 1
4 | 4
+1 Câu hỏi rất hay. Như * luôn *, phiên bản PostgreSQL của bạn nên được bao gồm. –