2014-01-29 34 views
-1

我有一個查詢,其末尾有rownum >=15
當我運行這個查詢時,這顯示了正確的結果,這意味着它的結果顯示了所有15行,並且所顯示行的順序沒有變化。結果示例順序如下:1,2,3,
但是,當我從查詢中刪除rownum >=15時,結果不會按順序顯示1,2,3,而是顯示順序1,3,2。
來自你們的任何想法都會對我解決這個問題很有幫助。Rownum導致結果以無序方式顯示結果

+7

這是MySQL還是Oracle?你要從這個問題中解脫出來的就是「如果你想要訂購結果,可以使用'ORDER BY'」,這樣你就知道它在哪裏,但是如果你發佈了你的查詢,有人可以準確地指出你需要什麼樣的ORDER BY條款。 – Avarkx

+1

如果你發佈樣本數據和你正在嘗試的查詢..這將是我們很容易幫助 – Sai

+0

查詢太大,讓我看看我能否發佈它 – techy360

回答

1

這是來自很多人的持久查詢。

此類行爲的原因可以分析如下。

您的數據庫必須在串行模式

Oracle文檔說:

Oracle數據庫數據插入表中的兩種方法之一:

  • 串行模式:在常規INSERT操作,數據庫重用自由空間該表將新插入的數據與現有數據交錯。

  • 並行模式:在直接路徑INSERT操作期間,數據庫將插入的數據追加到表中的現有數據之後。現有數據中的可用空間不被重用,並且參照完整性約束被忽略。這些程序相結合可以提高性能。

在常規模式中,以下記錄

insert into users 
    values(1, 'Elvis'), (2, 'Jackson'), (3, 'Madonna'); 

可以結果在下面的存儲的次序。
基本選擇會因此產生相同的結果。

2 Jackson 
1 Elvis 
3 Madonna 

直接路徑INSERT,數據被附加到表的末尾,而不是使用當前分配給表現有空間。

要強制使用直接路徑INSERT,我們使用/*+ APPEND */提示。

insert /*+ APPEND */ into users 
    values(1, 'Elvis'), (2, 'Jackson'), (3, 'Madonna'); 

在表的末尾附加的行。
基本選擇因此將按插入順序獲取記錄

1 Elvis 
2 Jackson 
3 Madonna 

但發生了什麼選擇了直接路徑模式之前添加的這些記錄?插入時它們存在於相同的位置。要解決這樣的問題,我們必須通過選擇使用任何下列順序:

  • ROWID - 插入的行的地址標識。 (我的觀察是,每個表格都是順序的)。使用order by rowid
  • 收錄領域 - 比如,order by user_id
  • INDEX hint - 在合適的領域定義的索引,並使用此提示爲索引定義的順序獲取記錄。

上的數據,也沒有選擇,而是選擇了一個適當的排序解決方案和檢索。

+0

插入行的順序與查詢返回的順序完全無關。這個答案唯一準確的部分是他們需要添加'order by'子句。 –

+0

OP的懷疑是爲什麼如果沒有使用訂單,他們不按照插入順序返回? –

+0

不知道你從哪裏得到這個想法Ravinder,OP只是詢問兩個查詢以及他們爲什麼以不同的順序返回結果。 –