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 |
+------+------+------+------+
假設複合材料關鍵是在Col1
到Col4
。想象一下,Col1,Col2,Col3一起代表一個組Id。第一行有Col4
作爲X
,所以我需要選擇表中的所有記錄,其中Col1 = 11
和和。接下來,因爲第二行是12,22,32'X',我需要選擇所有包含Col1 = 11
和Col2 = 22
和Col3=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';
但是,這並沒有更新任何行。
我真的很感謝這個問題的一些幫助。
你試過簡單的更新查詢嗎? –
你說的不清楚 - 哪些行必須更新爲Col4 = Y,當前Col4 = X的行或所有其他行?然後 - 不要使用循環,不要使用遊標等,這需要兩年時間才能完成。不要試圖用錘子耙葉;錘子是用來驅動釘子的。用耙子耙葉。即:使用UPDATE語句(普通SQL,不需要像循環這樣的過程代碼)。 – mathguy
我懷疑你顯示的語句是否會編譯,至少有幾個原因(所以你的意思是「返回0行」???) - 首先,你不能設置col4 = Y,它應該是='Y',第二行不在位(你的意思是WHERE t1。...而不是AND t1。...?)那麼:如果你的col1-col4繼續成爲主鍵通過將col4中的值更改爲'Y',無論現在不是'X'嗎?即使您使語法起作用,主鍵約束也應拒絕大多數更改。這個要求本身毫無意義! – mathguy