各位大侠再帮忙解决一个问题吧。先拜谢了。要从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个表,互相比较取值,实在不会,各位高手帮帮忙。
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个表,互相比较取值,实在不会,各位高手帮帮忙。
-- 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
(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