Oracle
 sql >> Datenbank >  >> RDS >> Oracle

SQL-Reihenfolge nach Elementen aus der IN-Klausel

Ihre Logik und die obigen Lösungen eignen sich zwar gut für kleine Maßstäbe, aber wenn Sie über mehr als 65.000 Elemente sprechen, benötigen Sie eine skalierbare Lösung.

Mein Vorschlag ist, diese Aufgabe in 2 Schritte aufzuteilen.

Schritt 1

Erstellen Sie eine temporäre Tabelle. Diese temporäre Tabelle hat mindestens 3 Spalten

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

Jedes Mal, wenn der Benutzer eine solche Abfrage anfordert, fügen Sie Daten, d. h. Element-IDs und ihre Sequenznummer, in diese temporäre Tabelle mit einem eindeutigen Schlüssel ein, um die Benutzersitzung zu identifizieren (möglicherweise Benutzer-ID oder Sitzungs-ID). Dieser Trick besteht darin, eine Kollision von Artikellisten zu vermeiden, wenn mehrere Benutzer gleichzeitig Berichte abfeuern.

Schritt 2

Starten Sie jetzt Ihre Berichtsabfrage, die Ihre Haupttabelle, temporäre Tabelle mit session_key verbindet . In der Abfragereihenfolgedaten basierend auf Ihrer Eingabereihenfolge (bereits in temporärer Tabelle gespeichert)

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

Diese Methode ist

  1. datenbankunabhängig
  2. skalierbar mit beliebig vielen Eingängen
  3. Bietet die bestmögliche Leistung

Hinweis:Um die Abfrageleistung weiter zu verbessern, erstellen Sie einen Index für session_key, item_id in der temporären Tabelle und erstellen Sie einen Index für item_id in der ITEM-Tabelle (falls noch nicht vorhanden)

Bearbeiten:Oracle bietet Global Temporary Table an Funktion, die über Funktionen verfügt, um Datensätze nur während der Sitzung zuzulassen und beim Festschreiben / Ende der Sitzung usw. automatisch zu bereinigen. Sie können diese Funktion nutzen und Sitzungsschlüssel vermeiden, aber diese Lösung kann nicht auf andere Datenbankprodukte repliziert werden, es sei denn, sie ähnliche Funktion unterstützen.