2012-02-21 58 views
0

在我們的應用程序中,我們有兩組表:一組工作表(包含當前分析的數據)和另一組存檔表(所有數據甚至被分析過,相同的表名,但前綴爲a_)。表的結構是相同的,除了歸檔表有一個額外的列run_id來區分不同的數據集。將表A的內容複製到表B(比表A多一列)

目前,我們有一個SQL腳本的內容複製在具有類似這樣的語句:

insert into a_deals (run_id, deal_id, <more columns>) 
select maxrun, deal_id, <more columns> 
from deals, 
    (select max(run_id) maxrun from batch_runs); 

這工作得很好,但每當我們添加新列到表中,我們也有mpdify的腳本。有更好的方法來做到這一點,當我們有新的專欄時,這是穩定的。 (當然結構必須匹配,但我們希望能夠不必更改腳本。)

FWIW,我們使用Oracle作爲RDBMS。

+0

你需要多長時間一次同步? – tbone 2012-02-21 12:37:43

+0

每月一次或兩次 - 我們每隔幾個月就會有一個新的列 – Thorsten 2012-02-21 12:48:17

回答

4

在第一個答案後面,可以構建一個pl/sql過程,它將讀取all_tab_columns以構建插入語句,然後立即執行。不是太難,但要小心你允許的輸入參數(table_name之類)以及誰可以運行它,因爲它可以爲SQL注入提供很好的機會。

+0

或者只是以這種方式生成插入語句。然後讓它查看並手動執行。 Jim Hudson的這種方法的好處在於,它可以覆蓋所有的表格,甚至是新添加的表格,只需查看「a_」表格名稱並通過刪除該前綴來扣除相應的工作表格即可。 – 2012-02-21 15:40:29

+0

我喜歡存儲過程的方法 - 它也可以檢查我們是否忘記將工作表中的列複製到存檔表中,或者甚至可以自動執行這些操作......太棒了! – Thorsten 2012-02-21 20:14:44

1

如果2代表具有相同的列以相同的順序(從ALL_TAB_COLUMNS COLUMN_ID),除了這run_id在前面,那麼你可以這樣做:

insert into a_deals 
select (select max(run_id) from maxrun), d.* 
from deals 
where ...; 

這是一個偷懶的辦法海事組織,和您需要確保這兩列的列在這個腳本中位於相同的位置(檢查all_tab_columns)。切換的2個varchar2字段將導致數據插入到不正確的字段中。

+0

我們有類似的想法,但依賴列的順序(這是SQL中的一個實現細節)對我們來說聽起來有點太冒險了。 – Thorsten 2012-02-21 14:14:13

+0

這也會給每一行不同的run_id - 每次nextval觸發。 – 2012-02-21 14:17:06

+0

@JimHudson是正確的,我不確定是什麼要求,只是顯示插入到選擇方法。這也可以是一個子選擇。我會更新它。 – tbone 2012-02-21 14:20:47

相關問題