各位大侠再帮忙解决一个问题吧。先拜谢了。要从5个表取值,先以3个表作为例子说明。分别是JOB,NAME,ADDRESS表吧。数据形式如下
JOB表                  NAME表                         Address表
有效日  J1    J2       有效日    N1    N2             有效日      A1    A2
-----   --    ---      -----    ---   ----            ------    ----   -----
07/01   J1A   J2A      07/02    N1A    N2A             07/03      A1A   A2A
08/01   J1B   J2B      08/02    N1B    N2B             09/03      A1B   A2B
09/01   J1C   J2C      09/02    N1C    N3C     
        
有效日的概念:就是这条记录生效的日期,相应的,以前日期的记录就是无效的记录。
现在要分别取出各个表中有效的记录并输出,期望的结果如下。有效日  J1    J2   N1   N2   A1   A2
-----  ----  ---- ---- ---- ---- ----
09/01   J1C  J2C  N1B  N2B   A1A  A2A  (JOB表的有效日)
09/02   J1C  J2C  N1C  N2C   A1A  A2A  (NAME表的有效日)
09/03   J1C  J2C  N1C  N2C   A1B  A2B  (Address表的有效日)解释: 对于JOB表,最近的记录是有效日=09/01的记录,对于这个有效日,NAME表和Address应该分别取08/02和07/03的记录
       (因为对于NAME表,最新的记录是09/02开始才生效,在09/01这天,有效的记录是08/02对应的那条)
取出某个表最新的记录的方法我会
SELECT * FROM JOB JOB1
 WHERE 有效日 = (SELECT MAX(有效日) FROM JOB JOB2 
                  WHERE JOB1.KEY1 =JOB2.KEY2)
不过3个表,互相比较取值,实在不会,各位高手帮帮忙。

解决方案 »

  1.   

    ------------------------------------
    -- Author: flystone  
    -- Version:V1.001  
    -------------------------------------- Test Data: JOB表
    If object_id('JOB') is not null 
        Drop table JOB
    Go
    Create table JOB(有效日 nvarchar(5),J1 nvarchar(3),J2 nvarchar(3))
    Go
    Insert into JOB
     select '07/01','J1A','J2A' union all
     select '08/01','J1B','J2B' union all
     select '09/01','J1C','J2C' 
    Go
    -- Test Data: NAME
    If object_id('[NAME]') is not null 
        Drop table [NAME]
    Go
    Create table [NAME](有效日 nvarchar(5),N1 nvarchar(3),N2 nvarchar(3))
    Go
    Insert into [NAME]
     select '07/02','N1A','N2A' union all
     select '08/02','N1B','N2B' union all
     select '09/02','N1C','N3C' 
    Go
    -- Test Data: Address表
    If object_id('Address') is not null 
        Drop table Address
    Go
    Create table Address(有效日 nvarchar(5),A1 nvarchar(3),A2 nvarchar(3))
    Go
    Insert into Address
     select '07/03','A1A','A2A' union all
     select '09/03','A1B','A2B' 
    Go
    --Start
    select 有效日 ,j1,j2,n1,n2,a1,a2 from (
    Select top 1 a.有效日,b.有效日 as b效日 ,c.有效日 as c效日,j1,j2,n1,n2,a1,a2
    from JOB a
    left join [name] b 
    on a.有效日>b.有效日
    left join [Address] c 
    on a.有效日>c.有效日
    order by a.有效日 desc,b.有效日 desc ,c.有效日 desc) a
    union all
    select 有效日 ,j1,j2,n1,n2,a1,a2 from (
    Select top 1 a.有效日,b.有效日 as b效日 ,c.有效日 as c效日,j1,j2,n1,n2,a1,a2
    from [name] a
    left join [JOB] b 
    on a.有效日>b.有效日
    left join [Address] c 
    on a.有效日>c.有效日
    order by a.有效日 desc,b.有效日 desc ,c.有效日 desc)b
    union all
    select 有效日 ,j1,j2,n1,n2,a1,a2 from( 
    Select top 1 a.有效日,b.有效日 as b效日 ,c.有效日 as c效日,j1,j2,n1,n2,a1,a2
    from Address a
    left join [name] b 
    on a.有效日>b.有效日
    left join [job] c 
    on a.有效日>c.有效日
    order by a.有效日 desc,b.有效日 desc ,c.有效日 desc)c--Result:
    /*有效日   j1   j2   n1   n2   a1   a2   
    ----- ---- ---- ---- ---- ---- ---- 
    09/01 J1C  J2C  N1B  N2B  A1A  A2A
    09/02 J1C  J2C  N1C  N3C  A1A  A2A
    09/03 J1C  J2C  N1C  N3C  A1B  A2B(所影响的行数为 3 行)
    */
    --End 
      

  2.   

    select a.*,b.n1,b.n2,c.a1,c.a2 from (select * from JOB表 where 有效日=(select max(有效日) from JOB表 where 有效日<=当前日期)) a,
    (select * from NAME表 where 有效日=(select max(有效日) from NAME表 where 有效日<=
    (select max(有效日) from JOB表 where 有效日<=当前日期))) b,
    (select * from Address表 where 有效日=(select max(有效日) from Address表 where 有效日<=
    (select max(有效日) from NAME表 where 有效日<=
    (select max(有效日) from JOB表 where 有效日<=当前日期)))) c