ロジック以上のソリューションは小規模には適していますが、65000を超えるアイテムについて話している場合は、スケーラブルなソリューションが必要です。
私の提案は、このタスクを2つのステップに分割することです。
ステップ1
一時テーブルを作成します。この一時テーブルには、最小3列が含まれます
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
ユーザーがそのようなクエリを注文するたびに、データ、つまりアイテムIDとそのシーケンス番号を、ユーザーセッション(おそらくユーザーIDまたはセッションID)を識別するための一意のキーを使用してこの一時テーブルに挿入します。このトリックは、複数のユーザーが同時にレポートを起動するときにアイテムリストの衝突を回避することです。
ステップ2
次に、メインテーブルである一時テーブルをsession_key
で結合してレポートクエリを実行します。 。入力順序に基づくクエリ順序データ(一時テーブルに既に保存されています)
SELECT
T1.* , T2.item_report_order
FROM ITEM T1, TEMP_ITEM_ORDER_TABLE T2
WHERE T1.ITEM_ID = T2.ITEM_ID
AND T2.session_key = :input_session_key
ORDER BY t2.item_report_order
この方法は
です- データベースにとらわれない
- 任意の数の入力でスケーラブル
- 可能な限り最高のパフォーマンスを提供します
注:クエリのパフォーマンスをさらに向上させるには、session_keyにインデックスを作成し、一時テーブルのitem_idもITEMテーブルのitem_idにインデックスを作成します(まだ存在しない場合)
編集:オラクルはグローバル一時テーブル を提供しています 作成する機能には、セッション内でのみレコードを許可し、セッションのコミット/終了時などに自動クリーンアップする機能があります。この機能を利用してセッションキーを回避できますが、このソリューションは、他のデータベース製品に複製できない限り複製できません。同様の機能をサポートします。