SQL> set echo on
 SQL> set time on
 17:56:09 SQL> set timing on
 17:56:12 SQL> set autotrace traceonly
 17:56:19 SQL> @aaa.sql
 17:56:21 SQL> update (
 17:56:21   2    select /*+use_hash(a,b)*/a.bill_bal bill_bal_a ,b.bill_bal bill_bal_b
 17:56:21   3    from tjw_target_user a,tmp_tjw b
 17:56:21   4    where a.bill_id = b.bill_id
 17:56:21   5  ) set bill_bal_a = bill_bal_b;
 
 1335068 rows updated.
 
 Elapsed: 00:02:52.74
 
 Execution Plan
 ----------------------------------------------------------
    0      UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=681 Card=82 Bytes=
           2952)
 
    1    0   UPDATE OF 'TJW_TARGET_USER'
    2    1     HASH JOIN (Cost=681 Card=82 Bytes=2952)
    3    2       TABLE ACCESS (FULL) OF 'TMP_TJW' (Cost=2 Card=82 Bytes
           =1804)
 
    4    2       TABLE ACCESS (FULL) OF 'TJW_TARGET_USER' (Cost=674 Car
           d=1540412 Bytes=21565768)
 
 
 
 
 
 Statistics
 ----------------------------------------------------------
         610  recursive calls
     1365395  db block gets
       47221  consistent gets
       18052  physical reads
   318042748  redo size
         495  bytes sent via SQL*Net to client
         671  bytes received via SQL*Net from client
           3  SQL*Net roundtrips to/from client
           1  sorts (memory)
           0  sorts (disk)
     1335068  rows processed
 
 17:59:14 SQL>
 17:59:14 SQL> commit;
 
 Commit complete.
 
 Elapsed: 00:00:00.04
 17:59:14 SQL>
 17:59:14 SQL> update tjw_target_user a  set bill_bal = (
 17:59:14   2          select bill_bal from tmp_tjw b where a.bill_id = b.bill_id
 17:59:14   3  )
 17:59:14   4  where exists (
 17:59:14   5     select 1 from tmp_tjw c where a.bill_id = c.bill_id
 17:59:14   6  );
 
 1335068 rows updated.
 
 Elapsed: 00:07:08.56
 
 Execution Plan
 ----------------------------------------------------------
    0      UPDATE STATEMENT Optimizer=ALL_ROWS (Cost=169 Card=82 Bytes=
           1886)
 
    1    0   UPDATE OF 'TJW_TARGET_USER'
    2    1     NESTED LOOPS (Cost=169 Card=82 Bytes=1886)
    3    2       SORT (UNIQUE)
    4    3         INDEX (FAST FULL SCAN) OF 'PK_TMP_TJW_IDX' (UNIQUE)
           (Cost=2 Card=82 Bytes=738)
 
    5    2       INDEX (RANGE SCAN) OF 'PK_TJW_TARGET_USER_IDX' (UNIQUE
           ) (Cost=2 Card=1 Bytes=14)
 
    6    1     TABLE ACCESS (BY INDEX ROWID) OF 'TMP_TJW' (Cost=1 Card=
           1 Bytes=22)
 
    7    6       INDEX (RANGE SCAN) OF 'PK_TMP_TJW_IDX' (UNIQUE) (Cost=
           1 Card=1)
 
 
 
 
 
 Statistics
 ----------------------------------------------------------
         140  recursive calls
     1364964  db block gets
     6713317  consistent gets
       19867  physical reads
   317737072  redo size
         506  bytes sent via SQL*Net to client
         672  bytes received via SQL*Net from client
           3  SQL*Net roundtrips to/from client
           1  sorts (memory)
           1  sorts (disk)
     1335068  rows processed
注意 :
需要在a.bill_id, b.bill_id列上有唯一约束或索引才可以,否则报错:
实际例子:
update cm_cb_ss_circuitendpoint_bak c
 set c.sys_int_id=(select max(a.sys_int_id) from 
 (select * from cm_cb_ss_circuitendpoint_bak 
 where UPPER(data_status)!='NEW' and data_status is not null) a
 where a.dn=c.dn)
 where c.dn in (select dn from cm_cb_ss_circuitendpoint_bak
 where UPPER(data_status)='NEW' or data_status is null)
 这样就可以了。