2012-09-21 32 views
2

我有一個表MY_TABLE,主鍵爲MY_PK。然後,我有一個有序的主鍵列表,例如(17,13,35,2,9)。如何在Oracle/SQL中以給定順序檢索行?

現在我想用這些主鍵檢索所有行,並按照給定鍵的列表相同的方式保持行的順序。

我initally做什麼:

SELECT * FROM MY_TABLE WHERE MY_PK IN (:my_list) 

但隨後返回行的順序是隨機的,不符合給定鍵的順序了。有沒有辦法實現這一點? 我唯一想到的是生成許多SELECT語句並將它們與UNION連接起來,但我的主鍵列表可能非常長,並且包含數百甚至數千個鍵。我想到的另一種方法是在應用程序中對行進行重新排序,但我寧願選擇不需要的解決方案。

回答

1

確保您的結果集上的訂單的方法是使用ORDER BY,所以我會做的是插入一個2列的臨時表中您的主鍵和一個secuencial ID,您將在稍後使用以創建ORDER BY 。您態表將是:

PrimaryKey ID 
------------------- 
17   1 
13   2 
35   3 
2    4 
9    5 

之後只使用一個連接你的表上的PrimaryKey列,爲了你的時態表的ID列的態表的。

2

首先,這樣做與工會不一定會有所幫助。除非您有order by子句,否則結果集中行的排序不保證

這裏是一個解決方案,雖然這是不好的:

with keys as (
    select 1 as ordering, 17 as pk from dual union all 
    select 2 as ordering, 13 as pk from dual union all 
    select 3 as ordering, 35 as pk from dual union all 
    select 4 as ordering, 2 as pk from dual union all 
    select 5 as ordering, 9 as pk from dual 
    ) 
select mt.* 
from My_Table mt join 
    keys 
    on mt.my_pk = keys.pk 
order by keys.ordering 
2

僅Oracle 保證如果有一個明確的ORDER BY語句排序的結果集的順序。所以你真正的問題是,「我如何保證把我的結果排序爲任意順序?」

那麼簡單的答案是你不能。更復雜的答案是您需要將您的任意順序與可以排序的索引關聯起來。

我會假設你得到你的ID列表作爲一個字符串。 (如果你將它們作爲一個數組或類似的東西類似於桌子般的生活更容易。)所以首先你需要標記你的字符串。在我的例子中,我使用this other SO threadsplitter函數。我將在公用表表達式中使用它來獲取一些行,並使用rownum僞列來合成索引。然後我們將CTE輸出加入您的表格。

with cte as 
    (select s.column_value as id 
      , rownum as sort_order 
     from table(select splitter('17,13,35,2,9') from dual) s 
    ) 
select yt.* 
from your_table yt 
where yt.id = cte.id 
order by cte.sort_order 

警告:這是未經測試的代碼,但原則是健全的。如果確實遇到無法解決的編譯或語法錯誤,請在評論中包含足夠的詳細信息。

+0

Oracle,沒有,沒有RDBMS我知道將保證結果的排序,除非提供了'ORDER BY'語句。而且oracle可以不處理主機變量數組嗎?這正是我假設他正在使用的(所以不需要分裂,儘管其餘的想法都是正確的)。 –

相關問題