Vincent.Chan‘s Blog

          常用鏈接

          統計

          積分與排名

          網站

          最新評論

          oracle update多表關聯

          UPDATE A.A3 = A.A3+B.B3 的問題

          表A 結構 : A1 , A2 ,A3
          表B 結構: B1,  B2,  B3
          其中 A1 ,B1 為PK ,切值相同 就是可以使用A1 = B1 了.

          請問用SQL 語句或過程該如何實現如下的功能???

          更新A 表的 A3 ,用A.A3 與B.B3之和更新.

          3>update A
          set A3 = (select A.A3 + B.B3 from B where A.A1 = B.B1) ;

          7>update (select a1,a3,b1,b3 from a,b where a1=b1) set a3=a3+b3

          開執行計劃, 談論效率是沒有太多的意義的^_^..


          三樓的寫法與7樓的寫法得到的結果是不同的.

          三樓的寫法會更新所有記錄, 而7樓的寫法只修改兩者相交的相關記錄信息.

          7樓的寫法可以更加容易的控制這條update語句的執行計劃, 不過要求B表必須在對應的字段上有主鍵索引:) , 在B表在對應字段上有主鍵索引的時候, 建議使用7樓的寫法.

          可以參考一下這個帖子^_^

          http://www.cnoug.org/viewthread.php?tid=44070
          (測試沒有成功..不知道怎么搞的.)
          參考了下面的:
          非常佩服。抱著學習的態度,重寫了一下三樓的,在沒有主鍵的情況,請指教:
          update a
          set a3=(select a3+b3 from b where a1=b1)
          where a1=(select b1 from b where a1=b1)
          如下:
          update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.annuity-a.annuity)+(b.nojob-a.nojob)
          +(b.medicare-a.medicare)+(b.birthfee-a.birthfee)+(b.bruisefee-a.bruisefee) from con_eme_on200404 b
          where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.emp_base=(select b.emp_base from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.annuity=(select b.annuity from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.nojob=(select b.nojob from con_eme_on200404 bwhere a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.medicare=(select b.medicare from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.birthfee=(select b.birthfee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.bruisefee=(select b.bruisefee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.nojobbase=(select b.nojobbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.mediabase=(select b.mediabase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.birthbase=(select b.birthbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.bruisebase=(select b.bruisebase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)where a.emp_cod in(select b.emp_cod from con_eme_on200404 b
          where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)
          公積金:
          update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.accumulation-a.accumulation) from con_eme_on200404 b
          where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),a.accumulation=(select b.accumulation from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),
          a.accumulationbase=(select b.accumulationbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),a.accumulationbase1=(select b.accumulationbase1 from con_eme_on200404 b
          where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)
          where a.emp_cod in(select b.emp_cod from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)

          posted on 2006-02-22 13:03 Vincent.Chen 閱讀(235) 評論(0)  編輯  收藏 所屬分類: Database

          主站蜘蛛池模板: 邵阳县| 铜陵市| 鄄城县| 石柱| 凤庆县| 平原县| 商南县| 长治市| 乾安县| 汝南县| 获嘉县| 金门县| 木兰县| 通化县| 满城县| 奈曼旗| 灵武市| 大关县| 南康市| 林口县| 墨脱县| 云浮市| 绥中县| 千阳县| 珠海市| 承德市| 翁源县| 酉阳| 新郑市| 天柱县| 古田县| 岳池县| 偏关县| 晋江市| 柳州市| 和硕县| 灌云县| 玉山县| 金坛市| 新干县| 阜阳市|