关于select * from table where Dcode in(1,2,3,4,5。。。。。)的效率问题,求一个更好的解决方案!急!!

不老书生 2005-06-08 05:20:52
需求是这样的,
管理一个多级的组织树,可以理解成多级的单位、部门,或者其他组织,一张表,company表
例如:
+ 公司a code 01
公司a之分公司1 code 0101
公司a分公司1子公司1 code 010101
公司a分公司1子公司2 code 010102
公司a分公司1子公司3 code 01010201
..........
公司a之分公司2 code 0102
公司a分公司2子公司1 code 020101
公司a分公司2子公司2 code 020102
公司a分公司2子公司3 code 02010201

+ 公司b
公司b之分公司1 code 02
......................

上面公司的层数都是动态的,用户可以随意增加。
每一级的每一个公司下面都对应很多信息,比如职工,公司计划、总结等等,分别放在同一个的员工表,计划表,总结表里面,用code字段和上面的company表的code字段关联


客户对权限的需求是这样的,某个用户可以管理一个或者若干个公司(通过权限设置),以及这个公司下面的信息

比如用户a可以管理code为010101和010102的两个单位,包括他们下面的人员、总结、计划等

我现在的设计是这样的,比如在管理人员的页面,
首先判断用户的权限,得到该用户的拥有权限的单位列表,如:010101,010102

比如该用户的公司权限是01,那么我们通过一种方法,找出01下面的(包含01)的所有公司的code,因为每一级别的公司自己下面都会有部门和人员(公司总部也有自己的部门和人啊,这些人的相应公司的code和company的code匹配)

然后我用语句select * from 员工表 where code in (010101,010102) 得到该用户能够有权管理的员工列表

我现在有个疑虑
in语句的效率问题,如果某个用户属于最顶级的用户,拥有所有公司的管理权,那么它的公司权限列表就会很长(01,0101,010101,010102,0102,010201....,02),这样在执行起搜索员工的信息,效率会不会很慢??

因为所有的业务都是和公司权限挂钩的,那么不可避免的所有页面都要用到where code in (。。。。)这样的语句,

设置连统计分析,出具的结果也要跟用户的权限挂钩,因为要统计的范围首先满足在用户的权限范围内

我先很为这样的系统真正应用时的效率担心!

希望高手来仔细考虑一下,看看我的担心是多余的,或者有没有更好的解决方法???不甚感谢
...全文
207 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
skywebnet 2005-06-10
  • 打赏
  • 举报
回复
/我们现在的问题不是找不到某个单位的下级单位,而是已经找到了所有的某个人员可以管理的单位,

比如0101,0102,0103,

问题是要从人员表里找到属于上面三个单位的人员select * from 人员表 where 后面的sql 语句怎么写,我怕用in太影响速率。

/************************************************************************************/
select * from 员工表 where code like '010[1,2,3]%'
hglhyy 2005-06-10
  • 打赏
  • 举报
回复
用exists不用去扫描表。
heguosheng 2005-06-10
  • 打赏
  • 举报
回复
用exists?不过好象效率和in差不了好多的
不老书生 2005-06-09
  • 打赏
  • 举报
回复
code like '01%' 会把01所有下级单位的员工都找出来。但是用户的权限可能只是下属单位中的某几个,比如一共四个下属单位,0101,0102,0103,0104,而我只管两个单位,0101,0102,所以用like肯定不行啊
mengzulin 2005-06-09
  • 打赏
  • 举报
回复
为什么不用这样查
select * from 员工表 where code like '01%'
不老书生 2005-06-09
  • 打赏
  • 举报
回复
wangdehao(找找找) :你好!类似这样的问题应该怎么处理好呢?
wangdehao 2005-06-08
  • 打赏
  • 举报
回复
你这样的话已经没什么选择了,因为权限跟你的code关系不是很大,如果你可以跨单位上下级操作的话那这个上下级关系作用不太大,你只能用帐号对应权限的方法了
不老书生 2005-06-08
  • 打赏
  • 举报
回复
我们现在的问题不是找不到某个单位的下级单位,而是已经找到了所有的某个人员可以管理的单位,

比如0101,0102,0103,

问题是要从人员表里找到属于上面三个单位的人员select * from 人员表 where 后面的sql 语句怎么写,我怕用in太影响速率。
不老书生 2005-06-08
  • 打赏
  • 举报
回复
即使code 是有规律的,总公司编号01,下面是0102,0103,0101,0104

我的权限是操作0102和0104两个单位,也就是管理这两个单位的下面的人员、总结、计划等信息,

我又如何用like呢?like '01%'吗?那不成了对所有下级单位都有权限了?
paoluo 2005-06-08
  • 打赏
  • 举报
回复
首先,我们没有要求客户一定要规律,所以程序没有按规律的去做,因为一旦客户输入的不规律,系统就要出错,我们是用另一个上级代码来确定下级的。

--------------------------------------
那就是说还有一个“上级代码”这个字段了嘛。

我是说叻,如果只是那几个字段,又没有规律的话,上下级就没有办法体现出来。

如果是code没有规律的话,应该可以利用那个字段写函数。

不老书生 2005-06-08
  • 打赏
  • 举报
回复
paoluo(一天到晚游泳的鱼) :你好

-----------------------------------------------------------------
但是至少用户输入的code至少是有规律的吧,不然怎么区分上下级??

区分上下级有一定的规律的话,就可以用Like了。
------------------------------------------------------------------

首先,我们没有要求客户一定要规律,所以程序没有按规律的去做,因为一旦客户输入的不规律,系统就要出错,我们是用另一个上级代码来确定下级的。

另外,如果某个用户的公司的权限是若干平级的单位,我们从权限列表里面得到的值是10,13,15,我们又如何去用like呢?
paoluo 2005-06-08
  • 打赏
  • 举报
回复
上面的code,是我写的,比较规律010101的,但实际,我们并不要求客户这样写,编号是客户录入的,他们甚至可以加上字母,如ytsw001,ytsw002, 所以,用like肯定不行!

--------------------------------
但是至少用户输入的code至少是有规律的吧,不然怎么区分上下级??

区分上下级有一定的规律的话,就可以用Like了。
不老书生 2005-06-08
  • 打赏
  • 举报
回复
wangdehao(找找找) :上面的code,是我写的,比较规律010101的,但实际,我们并不要求客户这样写,编号是客户录入的,他们甚至可以加上字母,如ytsw001,ytsw002, 所以,用like肯定不行!

大大小小公司,在这个数据库里,应该有1000个左右!!!
wangdehao 2005-06-08
  • 打赏
  • 举报
回复
用 like 吧,公司的层数和数量应该不是很多的,这样查询出来的数量应该不太大,再查员工信息的话应该没什么问题,不知道有没有更好的方法,帮你顶

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧