2015-11-10 36 views
-1

我有一些值如下:通過在Oracle 11g中指定ROWNUM可以刪除一行?

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

我可以選擇通過下面的查詢的特定行值

select * from (select mystring , rownum rn FROM teststring ) 

其中RN = 2;

告訴方法刪除第二行給出行號,並給我簡要的解釋。我已嘗試如下,但它不工作....

delete from testring where rownum=2; 
+8

請將您的SQL作爲文本發佈,而不是圖片,並且不要以全部大寫形式發佈! – DavidG

+4

如果不使用'order by',你的'select'語句返回一個任意的行。堆組織表本質上是無序的。對於Oracle來說,返回三行中的任何一行都是完全有效的。由於各種原因,返回的哪一行可能會隨時間而改變。 –

+0

@JustinCave是現貨,結論是,基於'rownum'刪除是不明智的,你爲什麼需要?這其實並不是一個壞問題! – mjsqu

回答

1

Rownum是僞列。 rownum沒有永久分配給該行。這意味着您無法基於此標準構建查詢。

而應該用

delete from teststring where mystring = 'RAMALINGAM';

+0

只是我想使用rownum。想想我想刪除所有大於2的行。 –

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

刪除行您的查詢隨機返回行沒有特定的順序。 A 堆組織表是一個表,其中行存儲在沒有特別的順序。這是一個標準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這是沒有更多的僞列,但子查詢的結果集的行。
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); 
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 
); 

請建議我們可以改善它的性能。 任何意見表示讚賞。