解决方案 »

  1.   

    UPDATE RWD_TERMINAL_0851 A
       SET A.STR27 =
           (SELECT COUNT(1)
              FROM RWD_TERMINAL_0851 B
             WHERE B.STR21 = A.STR21
               AND B.str28 = '201402'
               AND B.str3 = '310000218201'
             GROUP BY B.str28, B.str21)
     WHERE A.STR28 = '201402'
      

  2.   

    MERGE RWD_TERMINAL_0851 A --
    USING (
           SELECT B.str28, B.str21, COUNT(1) c
           FROM     RWD_TERMINAL_0851 B
           WHERE  B.str3 = '310000218201'
           AND    B.str28 = '201402'
           AND    B.STR21 = A.STR21
           GROUP  BY B.str28, B.str21) b --
    ON (B.STR21 = A.STR21 AND B.str28 = A.STR28) --
    WHEN MATCHED THEN UPDATE
    SET    a.str27 = c
      

  3.   

      我的理解,这种写法本质上是一条条的进行更新的。如果表a的STR21有10万个,就需要对表b做10万次的聚合操作。
    我的思路就是,建张临时表保存表b所有的聚合结果,然后依据临时表更新目标表。这样,就会对表b仅仅聚合了一次,而不是10万次。  
     如有不妥,敬请指正。
    1 在表a的列STR28上建立索引,确保A.STR28 ='201402'能走索引
    2 建立一张事务级的临时表temp(),用于保存以下的结果集
    SELECT B.STR21, COUNT(1) cnt FROM RWD_TERMINAL_0851 B 
    WHERE B.str3='310000218201' AND B.str28='201402' 
    GROUP BY B.str21
    3 依据临时表的数据来更新目标表
     UPDATE  RWD_TERMINAL_0851 A SET A.STR27 =(
    SELECT  B.cnt FROM temp B 
    WHERE B.STR21 = A.STR21)
    WHERE A.STR28 ='201402';
    COMMIT
      

  4.   


    把 GROUP BY B.str28,B.str21 这个去掉,没什么正经用。另: B 表上可以根据这 3 列建一个IX。
      

  5.   

    with temp as(
    SELECT  /* +materialize */COUNT(1)  cnt FROM RWD_TERMINAL_0851 B 
    WHERE B.str3='310000218201' AND B.str28='201402' 
    GROUP BY B.str28,B.str21
    ),
    UPDATE  RWD_TERMINAL_0851 A SET A.STR27 =(select  cnt from temp c where a.STR21=c.STR21
    )
    WHERE A.STR28 ='201402'
    大概是这样写的吧,自己看看调试下