我正在做一个人员管理系统,一个人属于一个部门,部门之间有隶属关系。用的数据库是DB2。我要实现的功能是,根据当前登录用户所属部门查出所有下属部门,然后将这些部门的所有人员都查出来。遇到的问题是,如果一个部门的级别很高,它的下属部门就很多(多的情况下会有近百条),在查询人员的时候会有一个条件IN(所有部门),这样可能会导致数据库查询很慢(别人说会很慢,我没试过不知道)。请大家帮我想想办法,该怎么解决。

解决方案 »

  1.   


    抱歉,说错了,我们用的是MySQL数据库。请问楼上,用join查询的意思是对每一个部门执行一个select语句,对结果合并?这样的性能会比用in高?
      

  2.   

    你不能把需要查的部分使用 SQL 出来么?再与结果集进行 JOIN
      

  3.   

    你可以用NOT in 来试试啊。要么就用or这样的关键字来拼咯。
      

  4.   

    最好not in还有or不要用,能不用就不用
      

  5.   


    可能我没表达清楚,我的意思是把部门全部查出来以后,有多少个部门就写多少个select语句,然后用join连接起来,发送到数据库一次执行。为什么这样做的性能会比用in要高呢?
      

  6.   

    MySQL IN 里面几百个参数,根本感觉不到慢的。
    数据表超过百万条记录,才有必要考虑效率问题
      

  7.   


    你这样做不对 应该是点到 A部门 显示 A部门下的分部门以及A部门下的员工(1次查询)
    然后点到A部门下的分部门B,然后在B部门下显示B部门下的分部门下的员工(再1次查询)你如果要从根节点 直接把全部的东西一次性 全部查询出来的话 呵呵 要完蛋啦。还有不要用语句拼写啦 用 面向OO的方式吧 直接 A a = em.find(id); a.getSons()然后遍历 多少 写个递归一个方法搞定。
      

  8.   

    NOT in 和 in(in是不能命中索引)
    一般用exists来代替
      

  9.   

    这个你要是数据库设计的好,根本就不用in,
    比如说顶级部门 A01  总经办
                   A02  生产部
                   A0201 胶印车间
                   A0201 彩盒车间
                   
      

  10.   

    没有发布完成
    A01 总经办
    A02 生产部
    A0201 胶印车间
    A0202 彩盒车间
    A020101 胶印打包车间
    A020102 胶印检测车间如果要查生产部门  like 'A02%'
    如果要查 胶印车间 like 'A0201%'
    如果要查 胶印打包车间 like 'A020101%'
    这样不久解决了你的问题
      

  11.   


    但是like会比较慢,
    如果说查询生产部门
    A02 这样,把员工信息的部门截取前三位查询前三位 ='A02'如果说查询 胶印车间
    A0201 把员工信息的部门截取前五位 查询前五位='A0201'
    这样查询会比前面的要快