2016-11-28 81 views
1

我正在製作一個包含許多字段和1億個數據並且在某些字段上具有複合鍵的表。樣品表EMP有幾排出來的數百萬如下:Oracle 11g更新了包含數百萬條記錄的表中的行

+------+------+------+------+ 
| Col1 | Col2 | Col3 | Col4 | 
+------+------+------+------+ 
| 11 | 21 | 31 | X | 
| 12 | 22 | 32 | X | 
| 14 | 24 | 34 | X | 
| 11 | 21 | 31 | 555 | 
| 11 | 21 | 31 | 551 | 
| 12 | 22 | 32 | 89 | 
| 14 | 24 | 34 | 45 | 
+------+------+------+------+ 

假設複合材料關鍵是在Col1Col4。想象一下,Col1,Col2,Col3一起代表一個組Id。第一行有Col4作爲X,所以我需要選擇表中的所有記錄,其中Col1 = 11和​​和。接下來,因爲第二行是12,22,32'X',我需要選擇所有包含Col1 = 11Col2 = 22Col3=32的行。等所有情況下Col4 =X

我嘗試使用循環與光標,但它需要很多時間,因爲表有1億個數據和複合鍵。這需要很長時間。

僞循環語句的代碼,我想:

result= select Col1,Col2,Col3 from emp where `Col4=X`. 
for each row in result 
do 
    finalresult += select * from table where Col1 = row.Col1 and Col2 = row.Col2 and Col3 = row.Col3 
done 

finalresult將所有需要的數據。但是這已經持續了很長時間。

我也試圖合併更新如下

merge into emp t1 
    using (select * from emp t where t.col4=X) t2 
    on t1.col1=t2.col1 
    and t1.col2=t2.col2 
    and t1.col3=t3.col3 
    when matched then update set col4=Y 
and t1.col4!='X'; 

但是,這並沒有更新任何行。

我真的很感謝這個問題的一些幫助。

+1

你試過簡單的更新查詢嗎? –

+2

你說的不清楚 - 哪些行必須更新爲Col4 = Y,當前Col4 = X的行或所有其他行?然後 - 不要使用循環,不要使用遊標等,這需要兩年時間才能完成。不要試圖用錘子耙葉;錘子是用來驅動釘子的。用耙子耙葉。即:使用UPDATE語句(普通SQL,不需要像循環這樣的過程代碼)。 – mathguy

+1

我懷疑你顯示的語句是否會編譯,至少有幾個原因(所以你的意思是「返回0行」???) - 首先,你不能設置col4 = Y,它應該是='Y',第二行不在位(你的意思是WHERE t1。...而不是AND t1。...?)那麼:如果你的col1-col4繼續成爲主鍵通過將col4中的值更改爲'Y',無論現在不是'X'嗎?即使您使語法起作用,主鍵約束也應拒絕大多數更改。這個要求本身毫無意義! – mathguy

回答

0
select * 
    from emp x 
where x.col4 != 'X' 
    and exists (select 1 
       from emp y 
       where x.col1 = y.col1 
        and x.col2 = y.col2 
        and x.col3 = y.col3 
        and y.col4 = 'X')