DROP TABLE JJ;
DROP TABLE QQ;
Create table jj(
       jj_id integer,-- 物理主键
       REPORT_M_ID INTEGER,--主表ID
       ITEM_ID VARCHAR2(20),--项目
       Year varchar2(6),--报表年份
       Org_Code varchar2(10),--组织机构编码
       JAN integer,      --1月
       FER INTEGER,--2月
       MAR INTEGER,--3月
       BUSS_TYPE varchar2(10)--经营业务
);
CREATE TABLE QQ(
       QQ_id integer,-- 物理主键
       REPORT_M_ID INTEGER,--主表ID
       ITEM_ID VARCHAR2(20),--项目
       Year varchar2(6),--报表年份
       Org_Code varchar2(10),--组织机构编码
       JAN integer,      --1月
       FER INTEGER,--2月
       MAR INTEGER,--3月
       BUSS_TYPE varchar2(10)--经营业务
);
--JJ表,jj_id是物理主键,ITEM_ID+Year+Org_Code+BUSS_TYPE是业务组合主键,QQ表类似。
--相同的ITEM_ID+Year+Org_Code,即使BUSS_TYPE不同,但其REPORT_M_ID(主表ID)是一样的
--测试数据
insert into jj select 1,1,'A001_01','201206','H2222',3,3,3,'AA' FROM DUAL;
insert into jj select 2,1,'A001_02','201206','H2222',4,4,4,'AA' FROM DUAL;
insert into jj select 3,1,'A001_03','201206','H2222',5,5,5,'AA' FROM DUAL;
insert into jj select 4,1,'A001_01','201206','H2222',6,6,6,'BB' FROM DUAL;
insert into jj select 5,1,'A001_02','201206','H2222',7,7,7,'BB' FROM DUAL;
insert into jj select 6,1,'A001_03','201206','H2222',8,8,8,'BB' FROM DUAL;
insert into jj select 7,1,'A001_01','201206','H2222',6,6,6,'CC' FROM DUAL;
insert into jj select 8,1,'A001_02','201206','H2222',7,7,7,'CC' FROM DUAL;
insert into jj select 9,1,'A001_03','201206','H2222',8,8,8,'CC' FROM DUAL;
insert into jj select 10,3,'A001_01','201207','H2222',33,33,33,'AA' FROM DUAL;
insert into jj select 11,3,'A001_02','201207','H2222',44,44,44,'AA' FROM DUAL;
insert into jj select 12,3,'A001_03','201207','H2222',55,55,55,'AA' FROM DUAL;
insert into jj select 13,3,'A001_01','201207','H2222',66,66,66,'BB' FROM DUAL;
insert into jj select 14,3,'A001_02','201207','H2222',77,77,77,'BB' FROM DUAL;
insert into jj select 15,3,'A001_03','201207','H2222',88,88,88,'BB' FROM DUAL;
insert into jj select 16,3,'A001_01','201207','H2222',66,66,66,'CC' FROM DUAL;
insert into jj select 17,3,'A001_02','201207','H2222',77,77,77,'CC' FROM DUAL;
insert into jj select 18,3,'A001_03','201207','H2222',88,88,88,'CC' FROM DUAL;insert into QQ select 1,2,'B001_01','201206','H2222',11,11,11,'AA' FROM DUAL;
insert into QQ select 2,2,'B001_02','201206','H2222',12,12,12,'AA' FROM DUAL;
insert into QQ select 3,2,'B001_03','201206','H2222',13,13,13,'AA' FROM DUAL;
insert into QQ select 4,2,'B001_01','201206','H2222',14,14,14,'BB' FROM DUAL;
insert into QQ select 5,2,'B001_02','201206','H2222',15,15,15,'BB' FROM DUAL;
insert into QQ select 6,2,'B001_03','201206','H2222',16,16,16,'BB' FROM DUAL;
insert into QQ select 7,4,'B001_01','201207','H2222',111,111,111,'AA' FROM DUAL;
insert into QQ select 8,4,'B001_02','201207','H2222',122,122,122,'AA' FROM DUAL;
insert into QQ select 9,4,'B001_03','201207','H2222',133,133,133,'AA' FROM DUAL;
insert into QQ select 10,4,'B001_01','201207','H2222',144,144,144,'BB' FROM DUAL;
insert into QQ select 11,4,'B001_02','201207','H2222',155,155,155,'BB' FROM DUAL;
insert into QQ select 12,4,'B001_03','201207','H2222',166,166,166,'BB' FROM DUAL;
--第一、求UPDATE语句,修改A001_03的值 ,公式A001_03=B001_01+B001_03,修改后结果如下:
insert into jj select 3,1,'A001_03','201206','H2222',24,24,24,'AA' FROM DUAL;
insert into jj select 6,1,'A001_03','201206','H2222',30,30,30,'BB' FROM DUAL;
insert into jj select 12,3,'A001_03','201207','H2222',244,244,244,'AA' FROM DUAL;
insert into jj select 15,3,'A001_03','201207','H2222',310,310,310,'BB' FROM DUAL;--第二、求UPDATE语句,修改A001_03的值 ,公式A001_03=A001_01+B001_01+B001_03,修改后结果如下:
insert into jj select 3,1,'A001_03','201206','H2222',27,27,27,'AA' FROM DUAL;
insert into jj select 6,1,'A001_03','201206','H2222',36,36,36,'BB' FROM DUAL;
insert into jj select 12,3,'A001_03','201207','H2222',277,277,277,'AA' FROM DUAL;
insert into jj select 15,3,'A001_03','201207','H2222',376,376,376,'BB' FROM DUAL;--第三、求UPDATE语句,修改A001_03的值 ,公式A001_03=A001_01+A001_02+B001_01+B001_03,修改后结果如下:
insert into jj select 3,1,'A001_03','201206','H2222',31,31,31,'AA' FROM DUAL;
insert into jj select 6,1,'A001_03','201206','H2222',42,42,42,'BB' FROM DUAL;
insert into jj select 12,3,'A001_03','201207','H2222',321,321,321,'AA' FROM DUAL;
insert into jj select 15,3,'A001_03','201207','H2222',453,453,453,'BB' FROM DUAL;

解决方案 »

  1.   

    JAN integer, --1月
      FER INTEGER,--2月
      MAR INTEGER,--3月
      

  2.   

    CREATE VIEW vv (
       vv_id integer,-- 物理主键
       REPORT_M_ID INTEGER,--主表ID
       ITEM_ID VARCHAR2(20),--项目
       Year varchar2(6),--报表年份
       Org_Code varchar2(10),--组织机构编码
       JAN integer, --1月
       FER INTEGER,--2月
       MAR INTEGER,--3月
       BUSS_TYPE varchar2(10)--经营业务
    ) AS
      SELECT * FROM jj
       UNION ALL
      SELECT * FROM gg    UPDATE jj SET (jj.jan,jj.fer,jj.mar) = 
                 (SELECT SUM(vv.jan),SUM(vv.fer),SUM(vv.mar)
                    FROM vv
                   WHERE vv.item_id IN ('B001_01','B001_03')                          -- 或改为:('A001_01','B001_01','B001_03')
                             --        ('A001_01','A001_02','B001_01','B001_03')                 AND vv.year      = jj.year
                     AND vv.buss_type = jj.buss_type)
         WHERE jj.item_id = 'A001_03'
      

  3.   

    嗯不错,
    我还有一个需求:
    我只需要修改REPORT_M_ID=1的A001_03(A001_03=A001_01+A001_02+B001_01+B001_03),见下面结果。且我目前只传入参数REPORT_M_ID=1,如果用UNION ALL把QQ表关联起来,SQL怎么写的执行效率高些--第三、修改A001_03的值 ,公式A001_03=A001_01+A001_02+B001_01+B001_03,修改后结果如下:
    insert into jj select 3,1,'A001_03','201206','H2222',31,31,31,'AA' FROM DUAL;
    insert into jj select 6,1,'A001_03','201206','H2222',42,42,42,'BB' FROM DUAL;
      

  4.   

      UPDATE jj SET (jj.jan,jj.fer,jj.mar) =  
      (SELECT SUM(vv.jan),SUM(vv.fer),SUM(vv.mar)
       FROM vv
       WHERE vv.item_id IN ('B001_01','B001_03')    -- 或改为:('A001_01','B001_01','B001_03')
       -- ('A001_01','A001_02','B001_01','B001_03')   AND vv.year = jj.year
       AND vv.buss_type = jj.buss_type)
       WHERE jj.item_id = 'A001_03'
        AND jj.REPORT_M_ID=1