日期:2014-05-17  浏览次数:20597 次

求一种查询的优化算法
最近做项目,碰到一个问题。
数据表的结构如下
HierarchyId,NodeName ,ParentId三列,
最高管理员的的权限为根节点,ParentId为0
其他人的权限是根节点以下的,通过ParentId向上递归最终都可以到达根节点。
现在需要做的是根据节点名模糊查询,如果是最高管理员,没有问题,查询的结果肯定是子权限范围内的。
如果不是最高管理员,那么怎样确保查询的结果在这个人的权限范围内。
现在我的做法是,先得到这个人的权限节点,然后把查询得到的结果,一个个向上递归查找。如果者条线上的节点包含了这个人的权限节点,说明是操作者的权限范围,就添加进最后的实际结果。
但是这样实际运行效率不高。
希望有更优化的算法实现。

------解决方案--------------------
如果者条线上的节点包含了这个人的权限节点,说明是操作者的权限范围。
没看懂权限节点。。。
------解决方案--------------------
直接分配实际的东西给就行了.不用树形去弄.
------解决方案--------------------
拿数据举例吧 不明白怎么回事
------解决方案--------------------
有了数据,问题是啥? 举例描述下
------解决方案--------------------
引用:
如果是最高管理员来查询没有问题
现在是最高管理员以下的
就是经理 主管 这样的
模糊查询,根据节点名。
需要保证查询的结果是在自己的管辖范围
权限范围你可以理解为向下兼容
从本节点往下衍生的所有节点都是自己的职权范围

这种不就是求树节点吗? 求子节点
------解决方案--------------------
with tb(HierarchyId,NodeName,ParentId)
as(
 select  1 ,'CEO',0 union all
 select  2 ,'经理1',1 union all
 select  3 ,'经理2',1 union all
 select  4 ,'主管1',2 union all
 select  5 ,'主管2',2 union all
 select  6 ,'主管3',3 union all
 select  7 ,'主管4',3 union all
 select  8 ,'职员1',4
),
source as(
select * from tb where nodename like '%管1%'
union all
select tb1.* from tb tb1,source s1 where tb1.parentid=s1.HierarchyId
)
select * from source