UPDATE 表a SET name='tom' WHERE ID IN (SELECT ID FROM( SELECT ID FROM 表a WHERE SEX='男' )A WHERE ROWNUM<=10)   功能是修改表a中性别为‘男’的前十条数据的name字段,以上这条语句是否正确?我在java或plsql中运行这条语句要等很长的时间(估计有2分钟)才能修改成功。有没有人有简单高效的方法??

解决方案 »

  1.   

    不建议用rownum,
    用row_number()UPDATE a SET name='tom'
    where id in
    (
    select id
    from
    (
           SELECT ID,row_number()(order by id) rn FROM a WHERE SEX='男'
    )
    where rn<11)
      

  2.   

    UPDATE 表a t SET t.name='tom' WHERE ROWNUM<=10
      

  3.   

    UPDATE 表a t SET t.name='tom' WHERE sex='男' and ROWNUM<=10
      

  4.   

    SQL> SELECT * FROM test ;
     
      A    B
    --- ----
     14    0
     
    SQL> update test t set t.a=11 where rownum<=10;
     
    1 row updated
     
    SQL> select * from test;
     
      A    B
    --- ----
     11    0
     
    SQL> 
      

  5.   


    -- 这样是错误的,会误导人的!别想的太简单了......UPDATE a SET a.name='tom' 
    WHERE EXISTS (SELECT b.ID 
            FROM ( SELECT ID FROM 表a WHERE SEX='男' ) b 
    WHERE ROWNUM<=10 and b.ID=a.ID);
      

  6.   

    如果只是ROWNUM<=10是可以修改的,但前面再加上条件,就会报错了...
      

  7.   

    SQL> SELECT * FROM test ;
     
      A    B
    --- ----
     14    0
     
    SQL> update test t set t.a=11 where rownum<=10;
     
    1 row updated
     
    SQL> select * from test;
     
      A    B
    --- ----
     11    0
     
    SQL> update test t set t.a=11 where t.a=11 and rownum<=10;
     
    0 rows updated
     
    SQL> update test t set t.a=11 where t.a=14 and rownum<=10;
    SQL>  update test t set t.a=11 where t.a=14 and rownum<=10;
     
    1 row updated
     
    SQL> select * from test;
     
      A    B
    --- ----
     11    0
     
    SQL> 
      

  8.   


    -- 当然不会报错,但是更新的记录行可能不会有10行(当 sex='男' 的记录行超过10行的时候)
      

  9.   

    哦,那什么时候会出现你说的那种错,我模拟不出来
    SQL> select * from test;
     
      A    B
    --- ----
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     
      A    B
    --- ----
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     
      A    B
    --- ----
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     14    0
     
      A    B
    --- ----
     14    0
     14    0
     
    64 rows selected
     
    SQL> update test t set t.a=11 where t.a=14 and rownum<=10;
     
    10 rows updated
     
    SQL> select a ,count(*) from test group by a;
     
      A   COUNT(*)
    --- ----------
     11         10
     14         54
     
    SQL> 
      

  10.   

    这种单表update好像没问题啊,你是不是指那种用表b更新表a的情况?那种情况倒是必须加exists的。
      

  11.   

    我也等   这里rownum没什么错啊  不知道luoyoumou具体指什么rownum是在结果集产生后才生成的个人感觉不会有任何不妥
      

  12.   

    超过10行的情况下,rownum 是有可能 不是唯一的前10行...rownum的前10行是不一定的,需要确定唯一排序吧
      

  13.   

    shit  楼主又没有要求排序
      

  14.   

    是啊,不过楼主没说按什么排序,so我就给他个没排序的。
    排序的话可以这么写
    UPDATE 表a t SET t.name='tom' 
     where rowid in (select rowid from (select id from 表a where sex='男' order by 排序字段)where rownum<=10 )
      

  15.   

    试试这个快不:
    UPDATE a t SET t.name='tom' 
    where t.id in (
    select id from (
    select id,row_num() (partition by sex,order by id,name) rn from a where sex='男' and rn<=10) b)
      

  16.   

    UPDATE a t SET t.name='tom'  
    where t.id in (
    select id from (
    select id,row_number() (partition by sex,order by id,name) rn from a where sex='男' and rn<=10) b)
      

  17.   

    前十条记录不排序的话,用UPDATE 表a t SET t.name='tom' WHERE sex='男' and ROWNUM<=10
    修改没问题,不知道luoyoumou所说的是什么意思,等待他的模拟结果。
      

  18.   

    luoyoumou的口气也太轻狂了,还居高临下地“记住”,这不是笑话么
    我也给你说个“记住”:不要企图在exists里用rownum控制条数,没有任何意义。exists代表存在,才不管你是1条还是10条。所以在这里minitoy是对的,你才是错的