当前位置: 代码迷 >> Oracle管理 >> 怎么根据B行的值,更新A行的值
  详细解决方案

怎么根据B行的值,更新A行的值

热度:85   发布时间:2016-04-24 05:33:21.0
如何根据B行的值,更新A行的值
各位大大,现有个问题,处理不了了,求帮忙 
tab1表如下(a,d为主键):
  a b c d
  000000 20 20 a
  010000 15 15 a
  010400 5 5 a
  000000 25 25 b
  010000 15 15 b
  010400 5 5 b
  000000 25 25 c
  010000 15 15 c
  010400 5 0 c


如果a字段值为010400时,b=c,则a字段010400的b和c的值设为0;
  a字段010000 的b字段减去010400的b的值,c字段减去010400的c字段的值;
  a字段000000 的b字段减去010400的b的值,c字段减去010400的c字段的值
;
如不等则不作修改

如何通过多个update语句实现?

结果为
  a b c d
  000000 15 15 a
  010000 10 10 a
  010400 0 0 a
  000000 20 20 b
  010000 10 10 b
  010400 0 0 b
  000000 25 25 c
  010000 15 15 c
  010400 5 0 c

update tab1 B set b=b-(select b from tab1 A where b=c and A.a=010400 and A.d=B.d ) where B.a=000000;
update tab1 B set c=c-(select c from tab1 A where b=c and A.a=010400 and A.d=B.d ) where B.a=000000;
上面的语句可以么?

------解决方案--------------------
先更新a字段010000 的
a字段000000的,
在更新a字段010400的
SQL code
update tab1 B set b=b-(select max(b) from tab1 A where A.b=A.c and A.a=010400) ,c=c-(select max(c) from tab1 A where A.b=A.c and A.a=010400) where a=010000;update tab1 B set b=b-(select max(b) from tab1 A where A.b=A.c and A.a=010400) ,c=c-(select max(c) from tab1 A where A.b=A.c and A.a=010400) where a=000000;update tab1 B set b=0 ,c=0where a=000000 and b=c;
------解决方案--------------------
实测数据
SQL code
CREATE TABLE T134(    a VARCHAR2(20),    b NUMBER(4),    c NUMBER(4),    d VARCHAR2(20));INSERT INTO T134 VALUES('000000', 20, 20, 'a');INSERT INTO T134 VALUES('010000', 15, 15, 'a');INSERT INTO T134 VALUES('010400', 5, 5, 'a');INSERT INTO T134 VALUES('000000', 25, 25, 'b');INSERT INTO T134 VALUES('010000', 15, 15, 'b');INSERT INTO T134 VALUES('010400', 5, 5, 'b');INSERT INTO T134 VALUES('000000', 20, 20, 'c');INSERT INTO T134 VALUES('010000', 15, 15, 'c');INSERT INTO T134 VALUES('010400', 5, 0, 'c');-- 更新a = '0000000' 和a='010000'的行UPDATE T134 T1 SET b = b - (SELECT b FROM T134 T2 WHERE b = c AND a = '010400' AND T2.d = T1.d),                c = c - (SELECT c FROM T134 T3 WHERE b = c AND a = '010400' AND T3.d = T1.d)WHERE (a = '000000' OR a = '010000') AND EXISTS(SELECT 1 FROM T134 T4 WHERE b = c AND a = '010400' AND T4.d = T1.d)-- 更新 a = '010400'的行UPDATE T134 SET b = 0, c = 0 WHERE b = c AND a = '010400';
  相关解决方案