Oracle

更新列中的特定行

  • August 16, 2017

我有一列有 82 行(來自 table1),我想用另一個表(table2)中的不同值更新其中的 76 行。避免 6 個特定行(1、10、38、39、46、77)。將這些行保留為空值。

我使用游標從我的 table2 中保存所有 76 行

Cursor my_cur
Is
 Select * from table2

然後我嘗試更新我的 table1

Begin
For x in  my_cur loop
  Update table1
  Set my_col = x.acct_num
  Where rnum not in ('1', '10', '38', '39', '46', '77');
end loop;
End;

但我最終用相同的值更新了這些行(所有 76 行只有 1 個 acct_num)。似乎我游標的最後一個值(acct_num)是我總是得到的唯一一個。

我想輸入不同的 acct_num 到 76 行,並以與我的 table2 中相同的順序

我在它們兩個中都添加了 rownum 以至少確定要跳過哪些行。任何想法如何做到這一點?謝謝。

您缺少基於可以更新數據的鍵…顯然 table1.my_col 中始終存在最後一個值,因為您正在做的是遍歷所有值並更新 table1 中的列。

數據庫設計不正確..你能分享你的表結構/定義嗎?

然後,我們可以為您提供一些解決方案

編輯:如果您只想將這些記錄從一個表移動到另一個表…

嘗試這個:

insert into t1 (my_col) as select acct_num from t2 where rownum not in ('1', '10','38', '39', '46', '77');

假設您有一個與 t1 和 t2 中的行相關聯的 rownum 列,您可以使用合併語句(未經測試,因為我們不知道表的結構):

MERGE INTO T1 as x
USING (
   SELECT * FROM T2
) as y
   ON x.rownum = y.rownum 
WHEN MATCHED AND x.rownum NOT IN ('1', '10', '38', '39', '46', '77') THEN
   UPDATE SET x.my_col = y.acct_num;

引用自:https://dba.stackexchange.com/questions/183582