我想在一个视图中转换此查询,我可以调用UserId作为参数来选择与该用户相关的所有组(包括那些组的子树)。 事实上,我有2个表: - “EVA_Roles”包含角色树,通过RoleHid字段中的物化路径定义为varchar(8000) - “EVA_UsersInRoles”通过字段UserId将用户与角色相关联 这里的问题是只有一些角色可能与EVA_UsersInRoles表中的用户有关,但是这些角色可能是树层次结构中其他角色的父级,因此我必须为每个用户检索多个子树。 最后我提出了这个查询似乎工作正常,但我想在视图中进行转换。我当然面临的问题是UserId参数,它是我用来过滤视图结果的参数,在子查询中。 是否有任何提示将其重构为视图?
SELECT A.RoleId, E.EndDate FROM EVA_Roles A INNER JOIN EVA_Roles B ON
A.RoleHid LIKE B.RoleHid + '%' AND B.RoleHid IN (SELECT RoleHid FROM EVA_Roles C
LEFT JOIN EVA_UsersInRoles D ON C.RoleId = D.RoleId WHERE
(D.Userid = @0 OR C.RoleId = @1) AND C.ApplicationId = @2)
LEFT JOIN EVA_UsersInRoles E ON A.RoleId = E.RoleId AND E.UserId = @0 WHERE
A.ApplicationId = @2 ORDER BY A.RoleId
我留下了参数,我应该将值传递给视图。我认为在视图中重构可能是不可能的。这只是以更友好的方式利用我的微ORM(PetaPoco),否则我必须在我的代码中使用SQL但是没关系,不要在这上面思考。
关于表格定义:
EVA_Roles
RoleId INT - Primary Key
RoleHid VARCHAR(800) - Here I store the materialized path of the tree using nodes
ids... An example on this later.
RoleLevel INT - Security level of the role
RoleName INT - Name of the role (admin, guest, ...)
ApplicationID INT - Id of the application (in a multi app scenario)
EVA_UsersInRoles
RoleId - INT
UserId - INT
RoleHid中的物化路径遵循此逻辑。考虑这个数据,其中RoleId 2是RoleId 1的子项: RoleId 1 RoleHid“1。”
RoleId 2 RoleHid“1.2。”
通过上面的查询,我可以检索绑定到特定用户和应用程序的所有子树。