sql >> Base de Datos >  >> RDS >> Oracle

Orden SQL por elementos de la cláusula IN

Si bien su lógica y las soluciones anteriores son buenas para pequeña escala, si está hablando de más de 65 000 elementos, necesita una solución que sea escalable.

Mi sugerencia es dividir esta tarea en 2 pasos.

Paso 1

Cree una tabla temporal, esta tabla temporal tendrá un mínimo de 3 columnas

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

Cada vez que el usuario solicite una consulta de este tipo, inserte datos, es decir, ID de elementos y su número de secuencia en esta tabla temporal con alguna clave única para identificar la sesión del usuario (posiblemente ID de usuario o ID de sesión). Este truco es para evitar la colisión de listas de elementos cuando varios usuarios disparan informes simultáneamente.

Paso 2

Ahora active su consulta de informe uniéndose a su tabla principal, tabla temporal con session_key . En los datos del pedido de consulta basados ​​en su pedido de entrada (ya almacenados en la tabla temporal)

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

Este método es

  1. independiente de la base de datos
  2. escalable con cualquier número de entradas
  3. Ofrece el mejor rendimiento posible

Nota:Para mejorar aún más el rendimiento de las consultas, cree un índice en session_key, item_id en la tabla temporal y también cree un índice en item_id en la tabla ITEM (si aún no existe)

Editar:Oracle ofrece Tabla temporal global función, que crea funciones para permitir registros solo dentro de la sesión y la limpieza automática al confirmar/finalizar la sesión, etc. Puede utilizar esta función y evitar la clave de sesión, pero esta solución no se puede replicar en otros productos de base de datos a menos que admite una función similar.