Oracle
 sql >> Database >  >> RDS >> Oracle

Ordine SQL per elementi dalla clausola IN

Mentre la tua logica e le soluzioni superiori sono buone per la piccola scala, se parli di più di 65000 elementi, hai bisogno di una soluzione che sia scalabile.

Il mio suggerimento è di dividere questa attività in 2 passaggi.

Passaggio 1

Crea una tabella temporanea, questa tabella temporanea avrà un minimo di 3 colonne

TEMP_ITEM_ORDER_TABLE (
  session_key varchar2(50),
  item_id number,
  item_report_order number
)

Ogni volta che l'utente ordina una tale query, inserire i dati, ovvero gli ID degli elementi e il loro numero di sequenza in questa tabella temporanea con una chiave univoca per identificare la sessione dell'utente (possibilmente ID utente o ID sessione). Questo trucco consiste nell'evitare la collisione degli elenchi di elementi quando più utenti inviano rapporti contemporaneamente.

Passaggio 2

Ora attiva la query del rapporto unendo la tua tabella principale, tabella temporanea con session_key . Nei dati dell'ordine di query in base al tuo ordine di input (già archiviato nella tabella temporanea)

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

Questo metodo è

  1. indipendente dal database
  2. scalabile con qualsiasi numero di input
  3. Offre le migliori prestazioni possibili

Nota:per migliorare ulteriormente le prestazioni della query, crea l'indice su session_key, item_id nella tabella temporanea crea anche l'indice su item_id sulla tabella ITEM (se non esiste già)

Modifica:Oracle offre Tabella temporanea globale funzionalità, che crea funzionalità per consentire i record solo con in sessione e la pulizia automatica al momento del commit/fine della sessione ecc. È possibile utilizzare questa funzione ed evitare la chiave di sessione, ma questa soluzione non può essere replicata su altri prodotti di database a meno che non supporta funzionalità simili.