在Access I中使用此虚拟表(table1),我想用下面显示的逻辑更新table2的字段。例如,对于ID = 1,table2中field2的所有值应该具有值10,而Date是< 1/1/2015,并且该日期之后的所有值应该具有值8,依此类推。
Table1
ID field1 reviewDate
1 10 1/1/2014
1 8 1/1/2015
2 5 3/3/2013
2 6 4/4/2014
2 4 5/5/2015
Table2
ID field2 Date
1 10 1/1/2014
1 10 2/1/2014
. . .
. . .
1 8 1/1/2015
我首先尝试使用select语句,看看我对所需结果的接近程度如下:
select a.ID, field1, max(reviewDate) as max , b.Date
from table1 a
inner join table2 b
on a.ID=b.ID
and b.Date >=a.reviewDate
group by ID,field1,reviewDate,Date
order by a.ID,b.Date
问题显然是当Date大于两个相同ID的reviewDates时,返回同一Date的两个值。我只想要当代。例如,对于ID = 1,日期= 2/1 / 2015 field2 = 8,但在我的脚本中,日期= 2/1/2015我有两条记录10和8。
答案 0 :(得分:0)
我会用相关的子查询来做这个:
select t2.*,
(select top 1 t1.field1
from table1 t1
where t1.id = t2.id and t1.reviewDate <= t2.Date
order by t1.reviewDate desc, t1.field1
) as field1
from table2 as t2;
答案 1 :(得分:0)
我找到了一个解决方案,可能不是最有效的,但仍然是一个解决方案。
我将ID,日期和相应的reviewDate存储在工作/临时表中。使用此查询:
select a.ID,a.Date,max(ReviewDate) as RevDate
into temp1
from table1 a
inner join table2 b on a.ID=b.ID and a.Date>=b.ReviewDate
group by a.ID,a.Date
然后我在table2,ReviewDate列中添加一个额外的列,更新加入temp1表的值
update table2 a
inner join temp1 b on a.ID=b.ID and a.date=b.date
set a.reviewDate=b.RevDate
然后我更新了在ID,date和reviewDate上加入table1的field2值。
update table2 a
inner join table1 b
on a.ID=b.ID and a.Date=b.Date and a.ReviewDate=b.Reviewdate
set a.field2=b.field1
我猜有些步骤可以合并,但我没有时间正确检查。随意提供更有效的解决方案。谢谢大家