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

          主站蜘蛛池模板: 陇西县| 富蕴县| 唐海县| 上栗县| 绥宁县| 大同市| 遂宁市| 涟水县| 麻栗坡县| 夏邑县| 防城港市| 乐平市| 广安市| 台中市| 唐海县| 吴桥县| 满洲里市| 琼结县| 林周县| 高唐县| 新郑市| 靖宇县| 襄汾县| 海兴县| 元氏县| 错那县| 汶上县| 长海县| 昌江| 当雄县| 颍上县| 麦盖提县| 乐山市| 西乌珠穆沁旗| 海南省| 娱乐| 郸城县| 比如县| 阿拉善右旗| 蒲城县| 徐汇区|