2013-01-10 29 views
0

現有對象和內容MS SQL - 實現循環的最佳方式

有一個名爲history_master的表,它每次記錄一個名爲master的特定表被更新。這就像主錶的歷史一樣。主表包含最新的數據只

爲了讓內容

主表

 

| id | item no| valid from | valid till | 
| 1 | 1  | 2012-12-25 | 2012-12-31 | 
| 2 | 1  | 2013-01-01 | 2013-04-30 | 
| 3 | 2  | 2013-01-10 | 2013-12-31 | 

history_master貌似手頭

 
| id | item no | valid from | valid till | update date | 
| 1 | 1  | 2012-01-01 | 2012-06-30 | 2012-02-01 | 
| 2 | 1  | 2012-07-01 | 2012-12-31 | 2012-02-01 | 
| 3 | 1  | 2012-01-01 | 2012-06-30 | 2012-05-01 | 
| 4 | 1  | 2012-07-01 | 2012-11-30 | 2012-05-01 | 
| 5 | 1  | 2012-12-01 | 2012-12-31 | 2012-05-01 | 
| 6 | 1  | 2012-07-01 | 2012-11-30 | 2012-08-01 | 
| 7 | 1  | 2012-12-01 | 2012-12-24 | 2012-08-01 | 
| 8 | 1  | 2012-12-25 | 2012-12-31 | 2012-08-01 | 

任務的例子:寫一個存儲過程,得到所有保留最新數據的歷史項目的可用數據,即結果應該看起來像

 
| item no | valid from | valid till | history_id | 
| 1  | 2012-12-25 | 2012-12-31 | 8   | 
| 1  | 2012-12-01 | 2012-12-24 | 7   | 
| 1  | 2012-07-01 | 2012-11-30 | 6   | 
| 1  | 2012-01-01 | 2012-06-30 | 3   | 

我想到的邏輯就是從歷史表中確定批次。對於例如記錄更新日期2012-08-01將有批次= 3,2012-05-01將有批次= 2和最後批次= 1

從最新(3)開始到最舊(1)遍歷所有批次,比較日期範圍,並確定結果記住最新設置的數據將始終優先。

我能想到的唯一實現方式是WHILE LOOP,我不確定它是否是最好的方法。

歷史大師包含截至目前的10155734條記錄。請建議

+1

爲什麼你需要一個存儲過程。這應該可以通過單個SQL語句來解決。 –

+0

兩張桌子之間的關係是什麼?我在history_master中沒有看到像master_id這樣的東西,並且item_id不是唯一的。 – Dutow

+1

SQL是一種面向* sets *的語言,您可以構造查詢來說明應如何處理輸入集,並且服務器計算出最佳實現方式並生成輸出集。通常應避免循環。 1000萬行並不龐大。 –

回答

0

我想你想要把更新日期到一個臨時表像這樣

select distinct [update date], identity(int, 1,1) history_id 
into #updatedates 
order by [update date] 

這給你喜歡這個

update date history_id 
2012-08-01 1 
2012-09-01 2 
2012-10-01 3 

一個表,然後加入,與原有表得到你的結果

select mh.[item no], mh.[vaild from], mh.[valid to], u.history_id 
from master_history mh join #updatedates u on mh.[update date] = u.[update date]