有3个表想关联查询到结果,但实际关联感觉很慢 查询甚至20分钟才出结果第一:人员表:人员ID | 姓名 | 所在单位的ID | 所在部门的ID  
------------------------------------------第二:单位部门表(单位和部门共同放在一个表里面)单位(或部门ID)  |   对应单位(或部门名称)
---------------------------------------
第三:职称表所属人员ID  |  职称ID  |  职称名称  |  年份 
-------------------------------------------现在想连接这3个表 获取人员的详细信息:人员ID | 姓名 | 所在单位名称 | 所在部门名称 | 职称名称
----------------------------问题是: 一个人有N个职称 只需要取年份最大的那个
         单位部门表有很多记录 假设有10万条
         职称表有很多记录 假设有600万条
         人员表有很多记录 假设有60万条 请问 怎样关联或数据库如何操作 比较高效率些呢  谢谢 

解决方案 »

  1.   

    select 
      a.人员ID,
      a.姓名,
      b.所在单位名称,
      c.所在部门名称,
      d.职称名称 
    from 人员表 a
    left join 单位部门表 b on a.所在单位的ID=b.单位(或部门ID)
    left join 单位部门表 c on a.所在部门的ID=c.单位(或部门ID)
    left join 职称表 d 
    on a.人员ID = d.所属人员ID 
    and not exists(select * from 职称表 where 所属人员ID=d.所属人员ID and 年份>d.年份)这种表结构,估计也快不了...
      

  2.   

    select K.人员id,K.姓名,所在单位名称=K.对应单位,所在部门名称=M.对应单位,N.职称
    from (select 人员表.人员ID,姓名,对应单位 from 人员表 join 单位部门表 on 人员表.所在单位ID=单位部门表ID) K  
       join (select 人员表.人员ID,姓名,对应单位 from 人员表 join 单位部门表 on 人员表.所在部门ID=单位部门表ID) M on K.人员ID=M.人员ID 
       join (select 人员id,职称名称 from 职称表 t where not exists(select 1 from 职称表 where 人员id=t.人员id and 年份>d.年份) N 
                  on M.人员ID=N.人员ID 然后在进行连接的几个字段建立索引
      

  3.   

    查询参考一二楼的,要快就在连接的几个字段建立索引
    create index idx_name on tb(col)
      

  4.   

    第一:人员表: (Memer)
    人员ID | 姓名 | 所在单位的ID | 所在部门的ID  
    第二:单位部门表(单位和部门共同放在一个表里面) DepartMent
    单位(或部门ID)  |  对应单位(或部门名称) 
    第三:职称表 Employee
    所属人员ID  |  职称ID  |  职称名称  |  年份 
    现在想连接这3个表 获取人员的详细信息: 人员ID | 姓名 | 所在单位名称 | 所在部门名称 | 职称名称 
    ---------------------------- 
    select M.人员ID,M.姓名,对应单位=D.对应单位,部门名称=D.部门名称,E.职称名称
    from Memer M left join DepartMent D on M.所在部门的ID=E.部门ID left join Employee E
    on E.所属人员ID=M.人员ID
      

  5.   

    搞错啦
    select M.人员ID,M.姓名,对应单位=D.对应单位,部门名称=D.部门名称,E.职称名称
    from Memer M left join DepartMent D on M.所在部门的ID=E.部门ID and M.单位的ID=E.单位ID left join Employee Eon E.所属人员ID=M.人员ID
      

  6.   

    职称表 
    从定义上来看,应该更新不是很频繁,而且既然查不出来,就不要查了。新建一张表 TA所属人员ID  |  职称ID  |  职称名称  |  年份 这张表是600万记录表中年份最高职称的表,你需要写一个select 语句,把这部分数据导入到新建的表里。在600万这张表上建立触发器,把新增人员id的职称信息插入到新建立的表里,把已有人员id的信息update到表TA。这样,你关联的时候,只需要关联TA 表,既不需要 聚合 操作,也不需要关联600万的表,达到你要的要求。如果在  年份 上有 聚合操作,应该在年份上加一个 索引。希望能对你有帮助,在硬件CPU和RAM条件有限的情况下,应该考虑在磁盘空间上扩展一下。
      

  7.   

    好像关键在于 职称表 的取每人的最新职称,因为其它都是直接的id关联,索引很好解决select b.*
    from (
      select 所属人员ID,max(年份) 年份
      from 职称表
      group by 所属人员ID,max(年份)
    ) a
    left join 职称表 b on a.所属人员ID=b.所属人员ID and a.年份=b.年份把上面作为一个固实视图(企业版才有),按所属人员+年份建立视图索引
    当然,职称表也需要按所属人员+年份建立视图索引