我有以下几个值:
MYSTRING
--------
Dharshan
Ramalingam
Devid
我可以通过以下查询
选择特定的行值select * from ( select mystring , rownum rn FROM teststring )
其中rn = 2;
告诉删除第二行的方法,给出行no并给我简要说明。我试过如下,但它不起作用....
delete from testring where rownum=2;
答案 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
它发生在三个层面:
答案 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
);
请建议我们可以改善它的表现。 任何评论表示赞赏。