至少Oracle可以做到hierarchical queries。考虑 db 用户角色的示例:
CREATE TABLE my_dba_role_privs(
grantee VARCHAR2(30),
granted_role VARCHAR2(30)
);
-- assigning roles to roles
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CLIENT', 'SELECT_ORDERS');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('COMMERCIAL_DEP', 'CREATE_ORDERS');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('COMMERCIAL_DEP', 'CLIENT');
-- assigning roles to users
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CL_MATT', 'CLIENT');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CL_JOHN', 'CLIENT');
INSERT INTO my_dba_role_privs( grantee, granted_role ) VALUES('CM_MARY', 'COMMERCIAL_DEP');
现在选择用户“CM_MARY”的所有角色:
SELECT DISTINCT GRANTED_ROLE role_name
FROM my_dba_role_privs
START WITH GRANTEE = 'CM_MARY'
CONNECT BY GRANTEE = PRIOR GRANTED_ROLE;
结果:
COMMERCIAL_DEP
CREATE_ORDERS
客户
SELECT_ORDERS
选择拥有角色“客户”的所有角色和用户
SELECT GRANTEE role_name
FROM my_dba_role_privs
START WITH GRANTED_ROLE = 'CLIENT'
CONNECT BY GRANTED_ROLE = PRIOR GRANTEE;
结果:
CL_JOHN
CL_MATT
COMMERCIAL_DEP
CM_MARY
更新:
既然你提到了,树将是相当静态的,尝试Joe Celko's Trees 可能会很有趣(大约 180 行要阅读)。
它根本不需要自我加入!所以,我希望它的执行速度比 CONNECT BY 快。虽然我刚刚在 30 分钟前读到它,但不知道它在现实世界中的效果如何
更新 2:“嵌套集模型”与 MySQL:Managing Hierarchical Data in MySQL 这与上面 Joe Celko 的树相同,但有更多示例和解释。