title: Update multiple columns in MERGE statement ORACLE
body: <p>I want to update multiple columns in MERGE statement,but for each column the conditions are different.How can I achieve it.</p>
  
  <p>I have more than 1 million rows in both the tables.All columns are number.Except Id all 3 columns have number with precision around 18 digits
  eg: 1.34255353433230675</p>
  
  <p>Is there a better way to Update.Around 50,000 rows might update daily So I have to merge the updates values to target table.
  I tried UPDATE and FORALL but its slow.</p>
  
  <p>I basically want to merge the difference based on common ID column.Any other approach is better?</p>
  
  <pre><code>DECLARE
  TYPE test1_t IS TABLE OF test.score%TYPE INDEX BY PLS_INTEGER;
  TYPE test2_t IS TABLE OF test.id%TYPE INDEX BY PLS_INTEGER;
  TYPE test3_t IS TABLE OF test.Crank%TYPE INDEX BY PLS_INTEGER;
  TYPE test4_t IS TABLE OF test.urank%TYPE INDEX BY PLS_INTEGER;
  
  vscore    test1_t;
  vid       test2_t;
  vcrank    test3_t;
  vurank    test4_t;
  BEGIN
   SELECT id,score,crank,urank
   BULK   COLLECT INTO vid,vscore,vcrank,vurank
   FROM   test;
  
   FORALL i IN 1 .. vid.COUNT
    MERGE INTO final T
    USING      (SELECT vid (i) AS o_id,
                       vcrank (i) AS o_crank,
                       vurank (i) AS o_urank
                       vscore (i) AS o_score
                FROM   DUAL) S
    ON         (S.o_id = T.id)
    WHEN MATCHED THEN
    UPDATE SET T.crank = S.o_crank
    WHERE  T.crank &lt;&gt; S.o_crank;
  
    UPDATE SET T.crank = S.o_crank
    WHERE  T.crank &lt;&gt; S.o_crank;
  
    UPDATE SET T.crank = S.o_crank
    WHERE  T.crank &lt;&gt; S.o_crank;
  
    UPDATE SET T.score = S.score
    WHERE  T.score &lt;&gt; S.score;
  
   -- I tried the below case its not working either...
  --   UPDATE SET T.crank = (CASE WHEN T.crank &lt;&gt; S.o_crank
  --                        THEN S.o_crank
  --                        END),
  --           T.urank = (CASE WHEN T.urank &lt;&gt; S.o_urank
  --                        THEN S.o_urank
  --                        END);  
  
   COMMIT;
  END;
  </code></pre>
  
  <p>/</p>