2015-10-02 209 views
0

在訪問我用這個虛擬表(表1),我想更新與下面顯示的邏輯表2的領域的最新值。例如,對於ID = 1倍的所有的FIELD2表2中的值的值應爲10,而日期是< 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 

的問題顯然是,當日期大於同一個ID的reviewDates同時返回兩個值。我只想要當代。例如,在指定日期ID = 1 = 2 /2015分之1域2 = 8只,但在我的日期腳本= 2 /二千零十五​​分之一我有兩個記錄10和8

回答

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 

然後,添加一個額外的列到我的表2,REVIEWDATE列,更新加入下的temp1表

update table2 a 
inner join temp1 b on a.ID=b.ID and a.date=b.date 
set a.reviewDate=b.RevDate 

值,然後我更新FIELD2值加盟上標識的表1 ,日期和審查日期。

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 

我想一些步驟可以合併,但我沒有時間去正確地檢查它。隨意提供更有效的解決方案。謝謝大家

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; 
+0

我想跑,但我收到此錯誤信息: – kostas

+0

@kostas「最多一個記錄可以通過這個子查詢返回」。 。 。這意味着給定的'id'可以有多個審閱日期。爲了解決這個問題,我在'order by'中添加了'field1'。但是,獨特的行將是最好的方法。 –

+0

這是正確的。現在,當我運行更新後的腳本時,會發生以下奇怪的事情。該腳本成功執行,正常提供數據表結果,並在幾秒鐘後彈出相同的錯誤消息「該子查詢最多可以返回一條記錄」擦除表中的每個值..你剛剛打破Access Gordon?:) – kostas