2011-11-28 35 views
2

我有一組主鍵。該集以記錄將要顯示的方式排序。基於一組排序的主鍵檢索數據

我想按照與排序集中相同的順序從數據庫中檢索記錄。

目前我在做這樣的:

cursor getdata is 
    select snr, -- snr is the primary key 
     field1, 
     field2, 
     field3 
    from MyTable, 
     (select COLUMN_VALUE snr, rownum sort_key from TABLE(varray_of_snr)) snr_tab 
    where MyTable.snr = snr_tab.snr 
    order by snr_tab.sort_key; 

的問題是,Oracle沒有讀取內選擇行以相同的順序,因爲它們是在varray。無法保證Oracle不會從內部選擇中的varray以相反順序讀取行。

有沒有簡單的方法來保證排序順序被保留?

+1

有什麼問題?這個查詢很慢?即使你的varray包含數百個值,排序也會很快。你確定你的查詢使用pk索引嗎?如果速度慢,可能會完全掃描桌子。 –

+0

問題是,不能保證Oracle不會從內部select中的varray中以相反的順序讀取行。 –

回答

1

這是我做過什麼:

我創建了一個全局臨時表,temp_snr_sort與列snrsort_id。 然後,我使用全局臨時表向我的snr:s添加sort_id。

-- Load the array with sort information into temp_snr_tab 
for i in 1..varray_of_snr.last loop 
    insert into temp_snr_tab values (varray_of_snr(i), i); 
end loop; 

-- Get the data correctly sorted 
open getdata for 
    select field1, 
     field2, 
     field3 
    from MyTable, 
     temp_snr_tab snr_tab 
    where MyTable.snr = snr_tab.snr 
    order by snr_tab.sort_id; 
0

更新:好吧,一個IDEEA(可能是有缺陷的:))

CREATE OR REPLACE TYPE snr_type as OBJECT (
    id   number , 
    srn  number) 

CREATE OR REPLACE TYPE varray_of_snr AS VARRAY(10000) OF snr_type; 

然後創建varary投入ID訂單

然後訂單來自序號主SQL。

+1

即使您的示例存在缺陷,我也明白您的意思。 –

+0

據我所知,仍然沒有*保證*,你的FOR語句中的SELECT將維持數組的順序。爲了保證順序,我知道的唯一方法是在SELECT語句中指定一個ORDER BY。 – MatBailie

+0

我更新了我的回覆 –

2

據我所知,任何數據集的順序決不會得到保證,除非指定了ORDER BY。

如果數組的順序是任意的,我建議在存儲數據時包含一個填充的row_id字段。 rownum只能用於替代,如果可以推斷的順序並使用ORDER BY子句。

+0

有幾種排序順序,因此將排序順序永久存儲在數據庫中不是一個選項。 –

+1

然後,您可能會被迫將所有可能的排序順序存儲爲添加字段。您需要包含足夠的數據才能使用ORDER BY來保證您所需的訂單。如果您可以更新您的問題(或開始一個新問題),並對您的真實世界問題進行更廣泛的描述,則可以採用其他方法。但要回答關於保證訂單的具體問題;只有ORDER BY可以保證。 – MatBailie

相關問題