2017-08-08 58 views
1

我有一個表(比如,ABC),其具有以下結構:更新與值的表從另一個表

COMP_CODE NAME SALARY SID1 
------------------------------------- 
    NULL  Alex  42000  85 
    NULL  Alex  42000  89 
    NULL  Alex  42000  96 
    NULL  Alex  42000 100 
    NULL  Alex  42000  52 

我想更新_ COMP_CODE _在從值上表中列居住在另一個表(CC)。兩張表中的匹配列是SID1CC的結構如下:

COMP_CODE SID1 
---------------------- 
    0AA   85 
    0AB   96 
    0CD   98 
    0DE   72 
    0EH  100 

可通過CURSOR或任何其它種類的方法的這個實現的。

+0

您可以使用直接查詢來更新ABC表。爲什麼要使用光標? – MKR

+0

當每個'sid1'有一個'comp_code'時很容易。但是你想爲'96'做些什麼?最小,最大,首先未使用?請解釋並顯示預期輸出。 –

+0

@ManojKumarRai我想一次更新整套數據,這就是爲什麼! – hashir

回答

1
MERGE INTO ABC t1 
USING (select SID,max(COMP_CODE) COMP_CODE from CC GROUP BY SID) t2 
ON (t1.SID1= t2.SID1) 
WHEN MATCHED THEN 
UPDATE SET t1.COMP_CODE = t2.COMP_CODE 
+0

ORA-30926:無法在源表中獲得一組穩定的行 – hashir

+0

糟糕我沒有看到CC中有多個值。這就是錯誤。你必須選擇使用哪個值。我編輯了查詢以提供一個選項。 –

+0

@戈登林諾夫我想我爲這個問題選擇正確的答案做出了草率的決定。通過_ ** MERGE ** _技術對解決方案進行了一番思考之後,我可以說它更加合理和有意義。欣賞每個人的努力。 – hashir

1

首先,不需要存儲兩次數據。您可以在需要時使用JOIN來獲取它。

可以作爲更新值:

update abc 
    set comp_code = (select cc.comp_code 
        from cc 
        where cc.sid1 = abc.sid1 
        ); 

這將在abc更新所有行。如果sid1在第二個表中不匹配,則該值將保持爲NULL

編輯:

你的第二個表中有相同的值多行。你需要弄清楚你想要哪一個。要選擇任意一個:

update abc 
    set comp_code = (select cc.comp_code 
        from cc 
        where cc.sid1 = abc.sid1 and rownum = 1 
        ); 

您也可以選擇MIN()MAX()LISTAGG()或價值的其他組合。

+0

光滑的男人。一個解決方案的地獄。做得好!感謝您的幫助 – hashir

+0

@hashir。合併將是比這更好的解決方案。問題只是你的數據而不是聲明。查看更新的anwer。 – XING

+0

@XING只有當我運行它時纔會更新單行。沒有冒犯,但數據就是這樣。 – hashir