可以通过在Oracle 11g中指定ROWNUM来删除行吗?

时间:2015-11-10 09:40:12

标签: sql oracle sql-delete rownum

我有以下几个值:

MYSTRING
--------
Dharshan
Ramalingam
Devid

我可以通过以下查询

选择特定的行值
select * from ( select mystring , rownum rn  FROM teststring  )

其中rn = 2;

告诉删除第二行的方法,给出行no并给我简要说明。我试过如下,但它不起作用....

delete   from testring where rownum=2;

4 个答案:

答案 0 :(得分:4)

select * from ( select mystring , rownum rn  FROM teststring  ) where  rn = 2;

您的查询在没有指定顺序的情况下随机返回行。 堆组织表是一个以无特定顺序存储行的表。这是一个标准Oracle表

来自Oracle documentation

  

如果没有order_by_clause,则不保证多次执行的同一查询将以相同的顺序检索行。

delete from testring where rownum=2;

您的上述查询显示您无法理解how ROWNUM works

您的查询永远不会删除任何行。

ROWNUM 值在通过查询的谓词阶段之后但在查询进行任何排序或聚合之前分配给一行。此外,ROWNUM值仅在分配后递增,这就是以下查询永远不会返回行的原因:

select * 
  from t 
 where ROWNUM = 2;

因为第一行ROWNUM = 2不成立,ROWNUM不会前进到2.因此,ROWNUM值不会大于1。

如何正确使用ROWNUM:

如果你想根据ROWNUM选择一行,你可以做一些像分页:

SQL> SELECT empno
  2  FROM
  3    (SELECT empno, sal, ROWNUM AS rnum FROM
  4      ( SELECT empno, sal FROM emp ORDER BY sal
  5      )
  6    )
  7  WHERE rnum =2;

     EMPNO
----------
      7900

它发生在三个层面:

  • 最内层子查询首先根据 ORDER BY 子句对行进行排序。
  • 在第二级,子查询分配 ROWNUM
  • 最外层查询根据内部查询给出的ROWNUM过滤行,该查询不再是伪列,而是子查询结果集。

答案 1 :(得分:2)

如果你想删除除了一行之外的所有行(只是为了理解rownum的工作方式):

delete 
from table 
where rowid in (select rwid 
                from (select rownum as rn, rwid
                      from( select rowid as rwid from table)
                      order by rwid)
                where rn > 1);

或更简单:

delete from table
where rowid <> (select rowid from table where rownum = 1);

答案 2 :(得分:1)

Rownum是一个伪列。 rownum未永久分配给该行。这意味着您无法根据此条件构建查询。

您应该使用

删除您的行

delete from teststring where mystring = 'RAMALINGAM';

答案 3 :(得分:0)

我已尝试过此查询,但工作正常。

DELETE FROM NG_USR_0_CLIENT_GRID_NEW WHERE rowid IN
( SELECT rowid FROM
  (
      SELECT wi_name, relationship, ROW_NUMBER() OVER (ORDER BY rowid DESC) RN
      FROM NG_USR_0_CLIENT_GRID_NEW
      WHERE wi_name = 'NB-0000001385-Process'
  )
  WHERE RN=2
);

请建议我们可以改善它的表现。 任何评论表示赞赏。