2

主キーMY_PKを持つテーブルMY_TABLEがあります。次に、たとえば(17,13,35,2,9)のように、順序付けられた主キーのリストがあります。

ここで、これらの主キーを使用してすべての行を取得し、指定されたキーのリストと同じ方法で行の順序を維持したいと思います。

私が最初にやっていたことは:

SELECT * FROM MY_TABLE WHERE MY_PK IN (:my_list)

ただし、返される行の順序はランダムであり、指定されたキーの順序に対応しなくなります。それを達成する方法はありますか?私が考えた唯一のことは、多くのSELECTステートメントを作成し、それらをUNIONと連結することですが、主キーのリストは非常に長く、数百または数千のキーを含む可能性があります。私が考えた別の方法は、後でアプリケーションで行を並べ替えることでしたが、これが不要なソリューションをお勧めします。

4

3 に答える 3

2

まず、組合でこれを行うことは必ずしも役立つとは限りません。句がない限りorder by、結果セット内の行の順序は保証されません。

エレガントではありませんが、ここに1つの解決策があります。

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
于 2012-09-21T14:28:15.293 に答える
2

Oracleは、結果セットが明示的なORDER BYステートメントでソートされている場合にのみ、結果セットの順序を保証します。したがって、実際の質問は、「結果を任意の順序に並べ替えることをどのように保証できますか?」です。

簡単な答えはできません。より複雑な答えは、任意の順序を並べ替え可能なインデックスに関連付ける必要があるということです。

IDのリストを文字列として取得していると思います。(それらを配列または同様のテーブルのようなものとして取得する場合は、より簡単です。)したがって、まず、文字列をトークン化する必要があります。私の例では、この他のSOスレッドsplitterの関数を使用しています。これを一般的なテーブル式で使用していくつかの行を取得し、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

警告:これはテストされていないコードですが、原則は健全です。解決できないコンパイルエラーまたは構文エラーが発生した場合は、コメントに十分な詳細を含めてください。

于 2012-09-21T14:49:42.973 に答える
1

結果セットでの順序を保証する方法はORDERBYを使用することです。したがって、私が行うことは、2列の主キーと後でORDERBYを作成するために使用するセキュリティIDを持つ一時テーブルに挿入することです。テンポラルテーブルは次のようになります。

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

その後、PrimaryKey列でテーブルとテンポラルテーブルの結合を使用し、テンポラルテーブルのID列で並べ替えます。

于 2012-09-21T21:56:09.117 に答える