update WAP_MOBILE_IMPORT set
       MAX_LAST_TIME = (
                        select max(LAST_TIME) from WAP_MOBILE_IMPORT
                        where substr(m.CREATED_TIME,0,10)>'2006-05-15' 
                        group by CREATED_TIME
                        ) 
你写的很多都是不需要的

解决方案 »

  1.   

    这个语句感觉没必要用
    group by 
    order by 
    吧?
      

  2.   

    update WAP_MOBILE_IMPORT set
           MAX_LAST_TIME = (    
                            select max(LAST_TIME) from WAP_MOBILE_IMPORT
                            where substr(CREATED_TIME,0,10)>'2006-05-15' 
                            group by CREATED_TIME,PROVINCE
                           ) 这样写仍然报ORA-01427: single-row subquery returns more than one row错误
    即使把group by CREATED_TIME,PROVINCE写成group by CREATED_TIME也是会同样的报错
      

  3.   

    order by 绝对没有必要但是 group by CREATED_TIME,PROVINCE真的很有必要,是个业务逻辑
    不同的CREATED_TIME,PROVINCE组合对应的 max(LAST_TIME)会不一样
      

  4.   

    那这样试下
              update WAP_MOBILE_IMPORT mi
                 set (mi.MAX_LAST_TIME) = (select max(m.LAST_TIME) as MAX_LAST_TIME
                                             from WAP_MOBILE_IMPORT m
                                            where substr(m.CREATED_TIME, 0, 10) >
                                                  '2006-05-15' and mi.CREATED_TIME =
                                                  m.CREATED_TIME and
                                                  mi.PROVINCE = m.PROVINCE
                                            group by m.CREATED_TIME, m.PROVINCE
                                           )
      

  5.   

    慢是完成正常的,,应为要进行多次全表扫描(update),而单个查询仅仅是查询一次而已..
    update WAP_MOBILE_IMPORT mi set (mi.MAX_LAST_TIME) =
    (
    select max(m.LAST_TIME) as MAX_LAST_TIME
    from WAP_MOBILE_IMPORT m
    where mi.CREATED_TIME = m.CREATED_TIME
    and mi.PROVINCE = m.PROVINCE
    and substr(m.CREATED_TIME,0,10)>'2006-05-15'
    ),,不能用group by 是显然的,,子查询必须只能返回一条记录是常识,,而group by 可能返回多条.
      

  6.   

    这个我已经自己试过了,结果是无限期等待,也不报任何的错误!(用的是toad 8.3)是不是因为表的字段不能作为条件来更新自己啊!?
      

  7.   

    但是,我这个子查询的逻辑是一定会返回多条记录的.如果我把子查询的结果拿出来先建个临时表再做update是不是会快些?
      

  8.   


    update WAP_MOBILE_IMPORT set
    MAX_LAST_TIME = (
    select max(LAST_TIME) from WAP_MOBILE_IMPORT
    where substr(m.CREATED_TIME,0,10)>'2006-05-15'

    这个试试阿
      

  9.   

    to:Paladin_china(大仙) 
    这个可以运行,说明可以更新自己但是子查询出来的是一个值,并没有根据 CREATED_TIME,PROVINCE 来取得相应的max(LAST_TIME)所以这个子查询的结果不符合业务逻辑.看来在update语句里面不能那多个值来更新,只能拿一个值来更新.不知道我这样说对不对啊!??!
      

  10.   

    sorry  to:Paladin_china(大仙)    这个可以运行,虽然没有报错,但仍然是无限期等待看来还是不能更新自己  :-(
      

  11.   

    表结构如下:
    CREATE TABLE WAP_MOBILE_IMPORT
    (
      SP_ID                  VARCHAR2(6 BYTE),
      DEST_USER_PSEUDO_CODE  VARCHAR2(14 BYTE),
      SP_SERVICE_ID          VARCHAR2(8 BYTE),
      ACTION                 CHAR(1 BYTE),
      FIRST_TIME             VARCHAR2(25 BYTE),
      LAST_TIME              VARCHAR2(25 BYTE),
      CREATED_TIME           VARCHAR2(25 BYTE),
      PROVINCE               VARCHAR2(5 BYTE),
      MAX_LAST_TIME          VARCHAR2(25 BYTE)
    )现在所有记录的 MAX_LAST_TIME 都没有数值
    我要先求得在相同省份(PROVINCE)和相同创建时间(CREATED_TIME)的记录中最大的 LAST_TIME .
    然后把这个最大的 LAST_TIME update到本表的 MAX_LAST_TIME 字段上,当然在update的时候 省份(PROVINCE)和创建时间(CREATED_TIME) 必须作为条件.说的简单点就是把相同省份和创建时间的记录的最大 LAST_TIME 赋值给有同样省份和创建时间的MAX_LAST_TIME 字段上
      

  12.   

    --------------------------------------------------------------
    您好,我们是“2006中国首届杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。
    一方面,他们会为您的问题提供满意的答案,
    另一方面,也邀请您为他们投上宝贵的选票。2006-7-8 ~ 2006-7-25日,每天我们将从当天参与"有奖投票"的网友
    中抽取3名幸运者,赠送由IBM提供的精美礼品一份!此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=88&pointid2=1&pointid3=5非常感谢您对本次活动的支持!
    --------------------------------------------------------------
      

  13.   

    我目前的水平用一个sql语句做不到,用游标倒是可以,期待高手解答
      

  14.   

    update  WAP_MOBILE_IMPORT mi set (mi.MAX_LAST_TIME) = 
    (
    select max(m.LAST_TIME) as MAX_LAST_TIME
    from        WAP_MOBILE_IMPORT m
    where substr(m.CREATED_TIME,0,10)>'2006-05-15' 
    and mi.CREATED_TIME = m.CREATED_TIME
    and mi.PROVINCE = m.PROVINCE  
    and substr(mi.CREATED_TIME,0,10)>'2006-05-15' 
    group by m.CREATED_TIME,m.PROVINCE
    order by  m.CREATED_TIME
    )
    where exists
    (
    select 1
    from        WAP_MOBILE_IMPORT m
    where substr(m.CREATED_TIME,0,10)>'2006-05-15' 
    and mi.CREATED_TIME = m.CREATED_TIME
    and mi.PROVINCE = m.PROVINCE  
    and substr(mi.CREATED_TIME,0,10)>'2006-05-15' 
    group by m.CREATED_TIME,m.PROVINCE
    order by  m.CREATED_TIME
    )
      

  15.   

    我觉得这里的子语句可以用函数实现,相当于传入两个参数CREATED_TIME,PROVINCE,返回一个最大值.
    update WAP_MOBILE_IMPORT outer1 set outer1.MAX_LAST_TIME = 
    (select max(inner1.LAST_TIME)
    from  WAP_MOBILE_IMPORT inner1
    where inner1.CREATED_TIME=outer1.CREATED_TIME and inner1.PROVINCE =outer1.PROVINCE
    group by m.CREATED_TIME,m.PROVINCE)
    where substr(outer1.CREATED_TIME,0,10)>'2006-05-15'
      

  16.   

    oracle的批量update语句很恶心的,sqlserver就简单多了,呵呵。
    lz按我写的试试吧,应该行的。
      

  17.   

    LZ还是去确认一下业务逻辑的正确性吧
    你的select max(LAST_TIME) from WAP_MOBILE_IMPORT
                            where substr(CREATED_TIME,0,10)>'2006-05-15' 
                            group by CREATED_TIME,PROVINCE
    结果有多条记录,怎么通过语句update啊
    用存储过程咯!
      

  18.   

    benny0526,这个就是你的不对了,谁告诉你只能update一条记录啊?
      

  19.   

    俺今天有空,陪你们玩玩,到处溜达,看看CSDN里的整体水平咋样。
    不过,看来看去,多数都很业余啊……这水平,中国软件怎么上去哦,急……
      

  20.   

    逻辑有问题啊
    update tbl set fld = value 
    这个value是一个值
    而select ... group by order by产生的是一个多个记录的集合。
    怎么能这样赋值呢?
      

  21.   

    楼上,
    UPDATE有两种:update ... 
    set f1=v1, f2=v2, ... 
    where ...update ... 
    set (f1, f2, ...) = (select ... from ... where ...) 
    where ...
      

  22.   

    有两种我知道,但是第二种的select 不能加group by ...order by
      

  23.   

    我也碰到过这个问题,这样更新速度奇慢,我建议是用存储过程吧1. 存储过程不能解决sql的问题..2. 建议将= 后面的结果根据关联条件分组将内容存储到临时表中.
       对临时表添加pk
       使用关联更新处理..create tabel tmp_tbl as
    select pk_col,count(*) cnt,sum(col) sum_col
    from src_tbl 
    where ...
    group by pk_col;
    alter table tmp_tbl add primary key (pk_col);update (
      select a.cnt_col,b.cnt
      from dest_tbl a,tmp_tbl b
      where a.pk_col = b.pk_col
    )
    set cnt_col = cnt;
    ...当然max_col也是一样..
      

  24.   

    lz试试我这种写法吧。估计得到的是你需要的update  WAP_MOBILE_IMPORT mi set (mi.MAX_LAST_TIME) = 
    (
    select MAX_LAST_TIME 
    from (
    select m.CREATED_TIME,m.PROVINCE,max(m.LAST_TIME) as MAX_LAST_TIME
      from WAP_MOBILE_IMPORT m
     where substr(m.CREATED_TIME,0,10)>'2006-05-15' 
     group by m.CREATED_TIME,m.PROVINCE
     order by m.CREATED_TIME
    ) mt
    where mi.CREATED_TIME = mt.CREATED_TIME
      and mi.PROVINCE = mt.PROVINCE  
    )
      

  25.   

    truexf(菲) ( ) 信誉:100  2006-07-12 14:36:00  得分: 0  
     
     
       有两种我知道,但是第二种的select 不能加group by ...order by
      
     
    ——错,照加不误。
      

  26.   

    to:zhangshenghua(张胜华)
    你的这个sql语句直接执行会报ORA-00907: missing right parenthesis,然后我把两个order by  m.CREATED_TIME去掉后就可以运行,只不过速度奇慢.等了10分钟仍然不见完成.
    update  WAP_MOBILE_IMPORT mi set (mi.MAX_LAST_TIME) = 
    (
    select max(m.LAST_TIME) as MAX_LAST_TIME
    from        WAP_MOBILE_IMPORT m
    where substr(m.CREATED_TIME,0,10)>'2006-05-15' 
    and mi.CREATED_TIME = m.CREATED_TIME
    and mi.PROVINCE = m.PROVINCE  
    and substr(mi.CREATED_TIME,0,10)>'2006-05-15' 
    group by m.CREATED_TIME,m.PROVINCE
    order by  m.CREATED_TIME
    )
    where exists
    (
    select 1
    from        WAP_MOBILE_IMPORT m
    where substr(m.CREATED_TIME,0,10)>'2006-05-15' 
    and mi.CREATED_TIME = m.CREATED_TIME
    and mi.PROVINCE = m.PROVINCE  
    and substr(mi.CREATED_TIME,0,10)>'2006-05-15' 
    group by m.CREATED_TIME,m.PROVINCE
    order by  m.CREATED_TIME
    )
      

  27.   

    to:czbbbs(强弩) 
    你的这个sql也能执行,但是过了10分钟也没有执行完成. :-(update  WAP_MOBILE_IMPORT mi set (mi.MAX_LAST_TIME) = 
    (
    select MAX_LAST_TIME 
    from (
    select m.CREATED_TIME,m.PROVINCE,max(m.LAST_TIME) as MAX_LAST_TIME
      from WAP_MOBILE_IMPORT m
     where substr(m.CREATED_TIME,0,10)>'2006-05-15' 
     group by m.CREATED_TIME,m.PROVINCE
     order by m.CREATED_TIME
    ) mt
    where mi.CREATED_TIME = mt.CREATED_TIME
      and mi.PROVINCE = mt.PROVINCE  
    )
      

  28.   

    to:zhangshenghua(张胜华)
    在中国当程序员都不容易,我虽然java很强,但是在数据库方面仍然是个新手.最近写了些存储过程,感觉是完全力不从心啊.
    唉,现在的老板想招一个人什么都会,而且还想样样精通啊,但是给的工资却少的可怜.
    5555~~~~~