本帖最后由 bkinside 于 2013-07-07 18:34:45 编辑

解决方案 »

  1.   


    select *
      from tableA f
     where f.TYPE = '入职日'
       and f.DATE <
           (select min(f2.DATE)
              from tableA f2
             where f.NAME = f2.NAME
               and f2.TYPE = '离职日');刚才想了一下,我是这样写的,不知道能不能优化。
      

  2.   

    有索引的话,无需优化
    另外一种思路select *
      from tableA f
      where f.TYPE = '入职日'
       and exists
            (select 1
             from tableA f2
             where f2.NAME = f.NAME
               and f2.TYPE = '离职日'
               and f2.DATE < f.DATE);
      

  3.   

       with A_CODE as 
    (
         select 'JACK' namea,'生日' TYPEa,'1980' DATEa from dual union all
         select 'JACK' namea,'入职日' TYPEa,'2000' DATEa from dual union all
         select 'JACK' namea,'离职日' TYPEa,'2008' DATEa from dual union all
         select 'TOM' namea,'生日' TYPEa,'1982' DATEa from dual union all
         select 'TOM' namea,'入职日' TYPEa,'2013' DATEa from dual union all
         select 'TOM' namea,'离职日' TYPEa,'2009' DATEa from dual union all
         select 'SAM' namea,'生日' TYPEa,'1988' DATEa from dual union all
         select 'SAM' namea,'入职日' TYPEa,'2006' DATEa from dual 
         
    )
    select *
      from (select tt.namea,
                   max(decode(TYPEa, '生日', DATEa, null)) as 生日,
                   max(decode(TYPEa, '入职日', DATEa, null)) as 入职日,
                   max(decode(TYPEa, '离职日', DATEa, null)) as 离职日
              from A_CODE tt
             group by tt.namea) TT
     where TT.入职日 < TT.离职日