2012-05-30 44 views
0

我試圖在Oracle中編寫一個update語句,該語句將根據時間戳從歷史記錄表中找到一個屬性。因此,例如數據的模樣:基於時間戳的歷史記錄表中的SQL更新語句

TABLE A 
A_ID TIMESTAMP    ATTR 
--------------------------------- 
1  5/27/2012 10:30:00 AM ? 

TABLE B 
B_ID A_ID TIMESTAMP    ATTR 
--------------------------------------- 
1  1  5/26/2012 9:01:08 AM W 
2  1  5/27/2012 8:38:21 AM X 
3  1  5/28/2012 9:01:01 AM Y 
4  1  5/29/2012 11:37:54 PM Z 

下界> = B.TIMESTAMP,但我不知道怎麼寫上限爲< B.「未來TIMESTAMP」。所以,在上面的例子中,表A上的屬性應該更新爲「X」。

這似乎是一個相當常見的用例。我看過this post,但它看起來像一個令人滿意的答案從來沒有達到過,所以我想我會再次發佈。

+0

在實際上可以開始構建查詢之前,您首先必須在句子中發出清晰的書面規則。表B中候選人記錄的定義是什麼? – Sebas

+0

該規則是:查找表B中的記錄,其中表A的時間戳> =表B的時間戳,但是<表B的下一個時間戳,除非它是最後的時間戳和FK(A_ID)匹配。那有意義嗎? – Paul

回答

0
UPDATE A SET attr = (
    SELECT b1.attr 
    FROM B b1 
     INNER JOIN (
      SELECT MAX(b3.timestamp) mx FROM B b3 
      WHERE b3.timestamp < A.timestamp 
     ) b2 ON b1.timestamp = b2.mx 
) 

我不記得Oracle是否允許我在內部連接子查詢中使用表A ......你介意試試嗎?

+0

允許加入,但未通過我所有的測試用例。我會玩弄它,看看我能否找到問題。 – Paul

+0

你能給我更多的信息嗎?出了什麼問題(請舉例)? – Sebas

+0

不是每個應該返回值的內部選擇的時間戳。我有一個更復雜的測試數據集。 – Paul

相關問題