sql >> データベース >  >> RDS >> Oracle

IN句の要素によるSQLの順序

    ロジック以上のソリューションは小規模には適していますが、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
    

    この方法は

    です
    1. データベースにとらわれない
    2. 任意の数の入力でスケーラブル
    3. 可能な限り最高のパフォーマンスを提供します

    注:クエリのパフォーマンスをさらに向上させるには、session_keyにインデックスを作成し、一時テーブルのitem_idもITEMテーブルのitem_idにインデックスを作成します(まだ存在しない場合)

    編集:オラクルはグローバル一時テーブル を提供しています 作成する機能には、セッション内でのみレコードを許可し、セッションのコミット/終了時などに自動クリーンアップする機能があります。この機能を利用してセッションキーを回避できますが、このソリューションは、他のデータベース製品に複製できない限り複製できません。同様の機能をサポートします。



    1. Oracle STANDARD_HASHはPLSQLでは使用できませんか?

    2. MySQLの空間インデックス-エラー-GEOMETRYフィールドに送信したデータからジオメトリオブジェクトを取得できません

    3. XMLAgg/XMLElementの使用中にバッファが小さすぎるエラー

    4. sshを最初にPythonでmysqldbを使用