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條記錄。請建議
爲什麼你需要一個存儲過程。這應該可以通過單個SQL語句來解決。 –
兩張桌子之間的關係是什麼?我在history_master中沒有看到像master_id這樣的東西,並且item_id不是唯一的。 – Dutow
SQL是一種面向* sets *的語言,您可以構造查詢來說明應如何處理輸入集,並且服務器計算出最佳實現方式並生成輸出集。通常應避免循環。 1000萬行並不龐大。 –