隨筆-144  評論-80  文章-1  trackbacks-0

          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)

          28DE6CC0EDBBE9A61E23D9E9D46BB8A9.gif

          posted on 2005-03-10 10:22 小力力力 閱讀(2527) 評論(0)  編輯  收藏 所屬分類: ORACLE
          主站蜘蛛池模板: 左贡县| 北流市| 阿鲁科尔沁旗| 榆中县| 钦州市| 浦江县| 驻马店市| 曲阜市| 西乡县| 莱州市| 科尔| 高碑店市| 武城县| 湖州市| 潜山县| 安仁县| 嘉义县| 南皮县| 井陉县| 文化| 巫山县| 泗水县| 天台县| 共和县| 惠东县| 沭阳县| 新竹市| 甘泉县| 佳木斯市| 桃源县| 彩票| 长兴县| 江北区| 吉林市| 崇左市| 左云县| 鄂伦春自治旗| 丹寨县| 九龙城区| 淮北市| 巴楚县|