2014-11-22 46 views
0

對不起,如果之前已經詢問過這個或類似的東西,但我一直在尋找一段時間,找不到任何答案或線索。基於第二張表在MS SQL 2008中插入/更新記錄,然後保持日期一致

所以,我有兩個表,看起來像這樣的數據:

表A

PK START STOP  DATA 
1 1/1/2013 12/31/2013 AAA 
1 1/1/2014 12/31/2014 AAA 
2 1/1/2013 12/31/2013 BBB 
2 1/1/2014 12/31/2014 BBB 

表B

PK DATE  DATA 
1 5/1/2013 CCC 
1 8/1/2014 (null) 
2 6/1/2014 QQQ 

現在我需要做的就是更新表A中插入的副本如果在START和STOP之間的tableB中有相應的記錄,則記錄在前記錄。

舉例來說,在這個例子中,這將是我的期望更新表A:

PK START STOP  DATA 
1 1/1/2013 4/30/2013 AAA 
1 5/1/2013 12/31/2013 CCC 
1 1/1/2014 7/30/2014 AAA 
1 8/1/2014 12/31/2014 (null) 
2 1/1/2013 12/31/2013 BBB 
2 1/1/2014 5/31/2014 BBB 
2 6/1/2014 12/31/2014 QQQ 

這是我到目前爲止已經寫的,但它似乎並沒有被工作作爲更新到以前的記錄的日期總是會變得混亂。

--For copying records 
SELECT 
    A.PK, B.DATE AS START, A.STOP, B.DATA 
INTO TEMP_TABLE 
FROM TABLEA A 
INNER JOIN TABLEB B ON B.PK=A.PK AND B.DATE BETWEEN A.START AND A.STOP 

--For updating records 
UPDATE A 
SET A.STOP=DATEADD(DD,-1,TT.START) 
FROM TABLEA A 
INNER JOIN TEMP_TABLE TT ON TT.PK=A.PK AND TT.STOP=A.STOP 

--Insert the records 
INSERT INTO TABLEA SELECT * FROM TEMP_TABLE 

我的推理有什麼問題嗎?還是有更好的方法去解決這個問題?任何投入將不勝感激。

+0

對錶B中的行數和表A中的時間段是否有任何限制?如:表B將包含表A中每行最多一行? – jscott 2014-11-22 01:24:03

+0

對錶B沒有限制,這裏的簡化版本是其他幾個腳本清理數據的結果,但理論上每個PK可能有任意數量的記錄。 – mooselover 2014-11-22 06:51:30

回答

0

我有兩點建議。首先,我想在你的「複製記錄」中選擇,你最後選擇的專欄應該是B.DATA而不是A.DATA

其次,您將您的臨時表格命名爲#TEMP_TABLE。使用哈希前綴將使其成爲一個實際的臨時表,它將在tempdb中創建,並在會話結束時超出範圍,並且對其他會話不可見。

這兩個調整,你的代碼似乎在這裏簡單的例子。但是,如果您的實際數據具有更復雜的關係,例如包含與tablea中給定行相對應的多行的tableb,則您的方法可能無法保持。

+0

A.DATA部分在我的僞代碼中是短視的,實際的代碼包含B.DATA。通常我會使用#temp表,但在這種情況下,我想要一步一步地保留數據,因此缺少哈希前綴。表B也不是1-1的關係,而且是清潔(但是很準確)的結果,所以如果這種方法存在問題,請告訴我是否有更好的攻角。 – mooselover 2014-11-22 06:53:09

+0

如果B可能包含適用於單個A行的多個行,並且您的意圖是將A表示的時間段拆分爲連續(不重疊)的時間段,則您可能需要使用遊標並處理B中的行一次。這會殺死你的表現,但可以讓你隨時更新A的狀態。 – jscott 2014-11-22 12:59:06

相關問題