Oracle
 sql >> Base de données >  >> RDS >> Oracle

Ordre SQL par éléments de la clause IN

Bien que votre logique et les solutions ci-dessus conviennent à une petite échelle, si vous parlez de plus de 65 000 éléments, vous avez besoin d'une solution évolutive.

Ma suggestion est de diviser cette tâche en 2 étapes.

Étape 1

Créer une table temporaire,Cette table temporaire aura 3 colonnes minimum

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

Chaque fois que l'utilisateur commande une telle requête, insérez des données, c'est-à-dire des identifiants d'éléments et leur numéro de séquence dans cette table temporaire avec une clé unique pour identifier la session de l'utilisateur (éventuellement l'identifiant de l'utilisateur ou l'identifiant de la session). Cette astuce permet d'éviter la collision des listes d'éléments lorsque plusieurs utilisateurs déclenchent simultanément des rapports.

Étape 2

Lancez maintenant votre requête de rapport en joignant votre table principale, table temporaire avec session_key . Dans les données de commande de requête basées sur votre commande d'entrée (déjà stockée dans la table temporaire)

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

Cette méthode est

  1. indépendant de la base de données
  2. évolutif avec n'importe quel nombre d'entrées
  3. Offre les meilleures performances possibles

Remarque :Pour améliorer encore les performances des requêtes, créez un index sur session_key, item_id dans la table temporaire, créez également un index sur item_id sur la table ITEM (s'il n'existe pas déjà)

Edit :Oracle propose table temporaire globale fonctionnalité, qui crée des fonctionnalités pour autoriser uniquement les enregistrements en session et le nettoyage automatique lors de la validation/fin de session, etc. Vous pouvez utiliser cette fonctionnalité et éviter la clé de session, mais cette solution ne peut pas être répliquée sur d'autres produits de base de données à moins qu'ils prend en charge une fonctionnalité similaire.