2017-08-08 19 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)。 2つのテーブルの一致する列は、SID1です。

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

この CURSORまたは方法の任意の他の種類によって達成することができ、次のように CCの構造があります。

+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

Oops CCで複数の値があります。それがエラーの原因です。使用する値を選択する必要があります。私はオプションを与えるためにクエリを編集しました。 –

+0

@ GordonLinoff私は質問の正解を選ぶ際に急いで決定したと思う。 _ ** MERGE ** _テクニックを通して解決策を熟考した後、私はそれがもっと賢明で有意義であると言えるでしょう。しかし、みんなの努力を感謝する。 – hashir

1

まず、データを2回保存する必要はありません。必要に応じてJOINを使用してフェッチすることができます。

あなたは、などの値を更新することができます。

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

これはabc内のすべての行を更新します。 sid1が2番目のテーブルで一致しない場合、値はNULLのままです。

編集:

2番目のテーブルには同じ値の複数の行があります。あなたはあなたが望むものを見つけ出す必要があります。任意のいずれかを選択するには:

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

またMIN()MAX()LISTAGG()または値の他のいくつかの組み合わせを選択することができます。

+0

スムースマン。解決策の1つの地獄。すごい仕事!ヘルプありがとう – hashir

+0

@hashir。マージはこれよりも優れた解決策でした。問題はあなたのデータだけではありませんでしたステートメント。更新されたanwerを参照してください。 – XING

+0

@XINGこれは、私がそれを実行するときにのみ、単一の行を更新します。犯罪はないが、データはそれである。 – hashir

関連する問題