Sql server SQL Server:转换查询以在视图中进行物化路径遍历

Sql server SQL Server:转换查询以在视图中进行物化路径遍历,sql-server,view,tree,subquery,materialized-path-pattern,Sql Server,View,Tree,Subquery,Materialized Path Pattern,我想在一个视图中转换此查询,我可以调用该视图,将UserId作为参数传递,以选择与该用户相关的所有组(包括这些组的子树) 事实上,我有两张桌子: “EVA_Roles”,包含角色树,通过RoleHid字段中的物化路径定义为varchar(8000) “EVA_UsersInRoles”通过字段UserId将用户与角色关联 这里的问题是,只有一些角色可能与EVA_UsersInRoles表中的用户相关,但这些角色可能是树层次结构中其他角色的父级,因此我必须为每个用户检索多个子树。 最后,我提出

我想在一个视图中转换此查询,我可以调用该视图,将UserId作为参数传递,以选择与该用户相关的所有组(包括这些组的子树)

事实上,我有两张桌子:

  • “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
我将参数留在应该向视图传递值的位置。我认为在视图中重构是不可能的。这只是为了以一种更友好的方式利用我的micro-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中的物化路径遵循此逻辑。考虑这个数据,其中RoRID 2是RoRID 1的子:
RoleId 1
RoleHid“1”

RoleId 2
RoleHid“1.2”


通过上面的查询,我能够检索到与特定用户和应用程序相关的所有子树。

请发布表结构和示例数据为什么不使用表值UDF?很抱歉迟到了。我在原始问题中添加了表格信息和更多细节