表User_Info记录员工基本信息:
username    用户名           nvarchar
bm          部门             nvarchar
表Ht记录员工合同信息:
ht_s        合同起始日期     DateTime
ht_e        合同终止日期     DateTime
bm          部门             nvarchar
zt          合同审核状态     nvarchar现程序执行查询语名:
select distinct ht.id,ht.ht_s,ht.ht_e,ht.zt,ht.username,user_info.bm,user_info.username from ht,user_info where ht.username=user_info.username and user_info.bm like '%" & BmStr & "%' order by ht.id desc
可以正常的查询出指定部门“BmStr”下员工的所有合同信息,但问题是,员工数量较多(16000以上)大家合同起止日期又不一样且每两年最少有一次合同信息,这样查询下来,得到的是所有员工的全部合同信息,而事实上,我们仅仅要知道的是员工最后一次的合同信息,可有比较好的方法实现?请高手指点!

解决方案 »

  1.   

    select distinct ht.id,ht.ht_s,ht.ht_e,ht.zt,ht.username,user_info.bm,user_info.username from ht inner join user_info on ht.username=user_info.username 
    inner join (select username,max(ht_s) as ht_s) as a
    on ht.username=x.username and ht.ht_s=user_info.ht_s
    where user_info.bm like '%" & BmStr & "%' order by ht.id desc
      

  2.   

    再加两个条件:用户名 group , 合同起始日期 倒排序, 在选Top1 应该就可了
    最好把测试数据贴出来,这样我们回贴也方便!
      

  3.   

    feiyun0112朋友:
      您说的方法调试不能通过啊,请指点!
      
    seu31199113朋友:
      测试数据很简单比如
      user_info表:
        张三    行政部
        李四    电脑部
      王五        财务部
        ht表:
     1 张三   2004-1-1   2004-12-31     已审核
     2 张三   2005-1-1   2006-12-31     已审核
     3 李四   2004-1-1   2004-12-31     已审核
     4 李四   2005-1-1   2005-06-30     已审核
     5 王五   2004-1-1   2004-06-30     已审核
     6 王五   2004-7-1   2006-12-31     已审核
      

  4.   

    更正一下错误,合同表结构里面没有部门,应该是:表User_Info记录员工基本信息:
    username    用户名           nvarchar
    bm          部门             nvarchar
    ...         ...              ...表Ht记录员工合同信息:
    ...         ...             .......
    username    姓名            nvarchar
    ht_s        合同起始日期     DateTime
    ht_e        合同终止日期     DateTime
    zt          合同审核状态     nvarchar
      

  5.   

    SELECT HT.ID,HT.HT_S,HT.HT_E,HT.ZT,HT.USERNAME,USER_INFO.BM,USER_INFO.USERNAME
      FROM HT,USER_INFO
     WHERE (HT.USERNAME,HT.HT_E) IN
    (SELECT HT.USERNAME USERNAME,
           MAX(HT.HT_E) LAST_HT
      FROM HT
     GROUP BY HT.USERNAME
     )
       AND HT.USERNAME=USER_INFO.USERNAME;