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這是沒有更多的僞列,但子查詢的結果集的行。
請將您的SQL作爲文本發佈,而不是圖片,並且不要以全部大寫形式發佈! – DavidG
如果不使用'order by',你的'select'語句返回一個任意的行。堆組織表本質上是無序的。對於Oracle來說,返回三行中的任何一行都是完全有效的。由於各種原因,返回的哪一行可能會隨時間而改變。 –
@JustinCave是現貨,結論是,基於'rownum'刪除是不明智的,你爲什麼需要?這其實並不是一個壞問題! – mjsqu