create table testSomething(
userid varchar(16),--人员编号
cardid int ,--出生证号码
isUsing int,--是否作废 1在使用,2已作废
timeChange datetime --作废时间
);insert into testSomething(userid,cardid,isUsing) values('22',1111,1);
insert into testSomething(userid,cardid,isUsing,timeChange) values('22',2222,2,'2010-09-14 15:28:55.577');
insert into testSomething(userid,cardid,isUsing) values('33',3333,1);
insert into testSomething(userid,cardid,isUsing,timeChange) values('33',4444,2,'2010-09-16 15:28:55.577');
insert into testSomething(userid,cardid,isUsing,timeChange) values('33',5555,2,'2010-09-17 15:28:55.577');
insert into testSomething(userid,cardid,isUsing) values('44',6666,1);--------查询结果,人员编号,出生证编号,变更前的出生证编号(最近作废的那个),没有变更的,显示空值
人员编号   出生证编号,变更前的出生证编号
  22         1111         2222
  33         3333         5555
  44         6666  

解决方案 »

  1.   

    SQL> with t1 as (select userid,cardid,isUsing,timeChange,row_number()over(partition by userid order by timechange desc) rn from testsomething  where isusing=2),
      2       t2 as (select userid,cardid,isUsing,timeChange from testsomething  where isusing=1)
      3  select a.userid,a.cardid,b.cardid  from t2 a left join t1 b
      4   on a.userid=b.userid and b.rn=1
      5  ;
     
    USERID                                            CARDID                                  CARDID
    ---------------- --------------------------------------- ---------------------------------------
    22                                                  1111                                    2222
    33                                                  3333                                    5555
    44                                                  6666 
     
    SQL> 
      

  2.   

    select userid,max(decode(rn,1,cardid,null)),max(decode(rn,2,cardid,null)) from(
    select userid,cardid,rn from(
    select userid,cardid,isusing,timechange,
    row_number() over(partition by userid order by timechange desc) rn from testsomething order by userid,timechange
    ) where rn = 1 or rn = 2
    )group by userid
      

  3.   

    SELECT  a.userid,
            a.cardid,
            b.cardid
    FROM    ( SELECT    userid,
                        cardid
              FROM      dbo.testSomething
              WHERE     isUsing = 1
            ) a
            LEFT JOIN ( SELECT  userid,
                                cardid,
                                timeChange
                        FROM    dbo.testSomething
                        WHERE   isUsing = 2
                                AND userid + CONVERT(VARCHAR(20), timeChange, 120) IN (
                                SELECT  userid
                                        + CONVERT(VARCHAR(20), MAX(timeChange), 120)
                                FROM    dbo.testSomething
                                WHERE   isUsing = 2
                                GROUP BY userid )
                      ) b ON a.userid = b.userid
      

  4.   

    SQL> edi
    已写入 file afiedt.buf  1  select b.userid,b.cardid,a.cardid
      2  from
      3  (select userid,cardid,isUsing
      4  from (select userid,cardid,isUsing,timeChange,
      5  row_number() over(partition by USERID order by TIMECHANGE desc) rn
      6  from testSomething
      7  ) where rn=2) a,
      8  (select userid,cardid,isUsing from  testSomething where isUsing=1) b
      9* where a.userid(+)=b.userid
    SQL> /USERID               CARDID     CARDID
    ---------------- ---------- ----------
    22                     1111       2222
    33                     3333       5555
    44                     6666
      

  5.   

    请问楼4 sql : where a.userid(+)=b.userid 中的+ 什么时候用什么时候不用很是 迷……
    谢谢高手 解释一下
      

  6.   


    此写法是Oracle的连接方式:右连接举个例子:
    查看如下语句: 
    SELECT ename , dname 
    FROM Emp, Dept 
    WHERE Emp.Deptno(+) = Dept.Deptno 
    也可以写成: 
    SELECT ename , dname 
    FROM Emp RIGHT JOIN Dept 
    ON Emp.Deptno = Dept.Deptno 
    此SQL文使用了右连接,即“(+)”所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现某个部门没有一个员工的情况,这个部门的名字都会在查询结果中出现。 反之: 
    查看如下语句: 
    SELECT ename , dname 
    FROM Emp, Dept 
    WHERE Emp.Deptno = Dept.Deptno(+) 
    也可以写成: 
    SELECT ename , dname 
    FROM Emp LEFT JOIN Dept 
    ON Emp.Deptno = Dept.Deptno 则是左连接,无论这个员工有没有一个能在Department表中得到匹配的部门号,这个员工的记录都会被显示 不知道这样解释你觉得怎么样? 
      

  7.   

    请问楼4 sql : where a.userid(+)=b.userid 中的+ 什么时候用什么时候不用很是 迷……
    谢谢高手 解释一下
    ---------左连接,和left join等同
    +号是比较老的一种写法,建议用jion