我要删除UserInfo表的第5行到第10行之间的数据

解决方案 »

  1.   


    --默认排序的删除
    delete UserInfo
        where exists (select 1 from (select rownum rn,UserInfo.主键列 from UserInfo) t
            where t.主键列=UserInfo.主键列 and t.rn between 5 and 10);--指定排序的删除
    delete UserInfo
        where exists (select 1 from (select row_number() over(order by 排序列) rn,UserInfo.主键列 from UserInfo) t
            where t.主键列=UserInfo.主键列 and t.rn between 5 and 10);
    只有记事本用,没法测,不知是否有错,自已测下,应没错,呵呵
      

  2.   

    delete UserInfo
        where exists (select 1 from (select rownum rn,UserInfo.主键列 from UserInfo) t
            where t.主键列=UserInfo.主键列 and t.rn between 5 and 10);
      

  3.   

    感谢楼上两位的回答,都可以实现,我还想请问下这个select 1 from XXX的用意是什么?
      

  4.   

    和select * 一样的,没什么用意,就是写起来方便,我的个人习惯,此处用来判断记录存在的
      

  5.   

    delete from UserInfo where rownum between 5 and 10;
    你试一下,看对不?
      

  6.   

    我要删除UserInfo表的第5行到第10行之间的数据还有这种删除数据的需求啊
      

  7.   

    这个和select完全不一样!!!!
    select *会去数据字典找metadata 但是select 1 却不会
    二者,起码在执行计划上就有区别了。
    下面用一个15万左右的表简单测试一下:23:42:53 hr@ORCL (^ω^) select 1 from test;已选择151359行。已用时间:  00: 00: 02.35
    执行计划
    ----------------------------------------------------------
    Plan hash value: 1357081020------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Cost (%CPU)| Time     |
    ------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |   151K|   473   (2)| 00:00:06 |
    |   1 |  TABLE ACCESS FULL| TEST |   151K|   473   (2)| 00:00:06 |
    ------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          12046  consistent gets
              0  physical reads
              0  redo size
        2038657  bytes sent via SQL*Net to client
         111375  bytes received via SQL*Net from client
          10092  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
         151359  rows processed
    23:45:00 hr@ORCL (^ω^) select * from test;已选择151359行。已用时间:  00: 00: 10.52
    执行计划
    ----------------------------------------------------------
    Plan hash value: 1357081020--------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |   151K|    13M|   479   (3)| 00:00:06 |
    |   1 |  TABLE ACCESS FULL| TEST |   151K|    13M|   479   (3)| 00:00:06 |
    --------------------------------------------------------------------------
    统计信息
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
          12046  consistent gets
              0  physical reads
              0  redo size
       16255363  bytes sent via SQL*Net to client
         111375  bytes received via SQL*Net from client
          10092  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
         151359  rows processed很明显:
    1)从执行时间上:select 1 是2秒;select *是10秒
    2)从cpu代价上:select 1 是473*2;而select *是479*2
    3)从i/o开销上:select 1和select *上是一样的
    当然了,这个测试只是小范围测试,数据量和测试数据不够多,但也可大体证明了我在上面提到的:select *会去查找数据字典,而select 1不会。
      

  8.   

    23:54:02 hr@ORCL (^ω^) select 1 from t1;         1
    ----------
             1
             1
             1
             1
             1
             1
             1
             1
             1
             1
             1
             1
             1
             1已选择14行。已用时间:  00: 00: 00.04
    23:54:07 hr@ORCL (^ω^) select * from t1;     EMPNO ENAME
    ---------- ----------------------------------------
          7369 SMITH
          7499 ALLEN
          7654 MARTIN
          7698 BLAKE
          7782 CLARK
          7839 KING
          7876 ADAMS
          7934 MILLER
          7521 WARD
          7566 JONES
          7788 SCOTT
          7844 TURNER
          7900 JAMES
          7902 FORD已选择14行。已用时间:  00: 00: 00.05这里的1只是个整数,全表扫描的代号而已。
    23:54:16 hr@ORCL (^ω^) select 2 from t1;         2
    ----------
             2
             2
             2
             2
             2
             2
             2
             2
             2
             2
             2
             2
             2
             2已选择14行。已用时间:  00: 00: 00.01
      

  9.   

    通常表内行的保存顺序是不定的,可能随意插入到有空位的数据这个表的数据块中。
    表行的排序需要指定 order by。
      

  10.   


    rownum不能那样用,必须嵌套表。