我在层次结构中有项目
Project1.Projects
+- Project1.1
+- Project1.2
Project2.Projects
+- Project2.1
+- Project2.2
Project3.Projects
+- Project3.1
通过 UserProject
为用户分配项目权限User.Id --> UserProject.Id.UserId
UserProject.Id.ProjectId --> Project.Id
(是的,这是一个复合ID,对不起......遗留数据库,你要做什么......)
现在,我需要一个特定用户可以访问项目或至少一个子项目的所有顶级项目的列表。
因此,如果UserA有权访问Project1和Project3.1,我想获得一个包含Project1和Project3(不是3.1 )的列表,最好使用一些用户没有Project3权限的信息。< / p>
在数据库中,项目与父链接一起存储:
Project:
| Project_ID | Parent_project_id | HasSubProjects | ... |
UserProject
| ProjectID | UserId | other properties... |
有关回归我想要的有效方法的建议吗?
更新:我最终得到了一个使用联合和分层连接的大量SQL语句。相当野兽。谢谢你的帮忙。
答案 0 :(得分:1)
我认为您希望将链接表加入到项目表中,从用户可以直接访问的集合开始,然后使用先前的连接遍历树:
select ProjectID from UserProject u
inner join Project p
on u.ProjectID = p.Project_ID
start with UserId = @foo
connect by prior Parent_Project_id = Project_ID
我没有任何东西可以对此进行测试,因此可能存在一些语法错误,但这是您想要使用的基本想法。