2017-08-17 60 views
0

我目前正在開發一個項目,其中有一個生產Oracle數據庫的副本,其中包含一些要用一組測試值替換的生產值(假設我有更多的生產記錄比測試,我會有重複)。用Oracle DB中的值替換測試數據集

這裏是什麼,我希望做一個樣本:

Data Set Sample

任何建議,將不勝感激。

+0

也許使用MOD(ROWNUM)相匹配的行? – Randy

回答

2

一種方法是通過他們的rowid進行編號行,然後用模運算原始數據與您的測試數據表,就像這樣:

merge into customer c 
using (
    with cte_customer as (
     select rowid xrowid, mod(row_number() over (order by rowid)-1,(select count(*) from test_data))+1 rownumber 
     from customer 
     order by rowid 
    ), cte_testdata as (
     select row_number() over (order by rowid) rownumber, first_name, last_name, email 
     from test_data 
     order by rowid 
    )    
    select c.xrowid, t.last_name, t.first_name, t.email 
    from cte_customer c 
    left outer join cte_testdata t on (t.rownumber = c.rownumber) 
    order by c.xrowid 
) u 
on (c.rowid = u.xrowid) 
when matched then update set 
    c.last_name = u.last_name, 
    c.first_name = u.first_name, 
    c.email = u.email 
+0

鑑於當前表和測試表包含完全不同的數據是不是過分複雜?爲什麼不刪除當前在那裏的數據然後添加需要在那裏的數據? – Ben

+1

@Ben Well,我猜想@Jeremy只給了我們一部分表結構。我的'合併'解決任務的方式,表中的其他列將保持不變。在數據倉庫/ ETL領域,像這樣混淆數據並不罕見。 –

+0

托馬斯,我認爲你的方法可能會奏效。但是我在「客戶」表中的記錄比「測試」表中的記錄多。我的假設是上面寫的只會更新存儲在測試表中的記錄數量。 – Jeremy