sql >> Database >  >> RDS >> Oracle

SQL-volgorde op elementen uit de IN-clausule

Hoewel uw logische en bovenstaande oplossingen goed zijn voor kleinschaligheid, heeft u een oplossing nodig die schaalbaar is als u het heeft over meer dan 65000 items.

Mijn suggestie is om deze taak op te splitsen in 2 stappen.

Stap 1

Maak een tijdelijke tabel, deze tijdelijke tabel heeft minimaal 3 kolommen

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

Telkens wanneer een gebruiker een dergelijke zoekopdracht bestelt, voegt u gegevens in, d.w.z. item-ID's en hun volgnummer in deze tijdelijke tabel met een unieke sleutel om de gebruikerssessie te identificeren (mogelijk gebruikers-ID of sessie-ID). Deze truc is om botsing van itemlijsten te voorkomen wanneer meerdere gebruikers tegelijkertijd rapporten afvuren.

Stap 2

Vuur nu uw rapportquery toe aan uw hoofdtabel, tijdelijke tabel met session_key . In de query bestelgegevens op basis van uw invoervolgorde (al opgeslagen in tijdelijke tabel)

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

Deze methode is

  1. database-agnostisch
  2. schaalbaar met een willekeurig aantal ingangen
  3. Geeft de best mogelijke prestatie

Opmerking:om de queryprestaties verder te verbeteren, maakt u een index op session_key, item_id in de tijdelijke tabel ook een index aan op item_id in de ITEM-tabel (als deze nog niet bestaat)

Bewerken:Oracle biedt Globale tijdelijke tabel functie, die functies creëert om records alleen toe te staan ​​met in sessie en automatisch opschonen bij vastlegging/einde van sessie enz. U kunt deze functie gebruiken en sessiesleutel vermijden, maar deze oplossing kan niet worden gerepliceerd op andere databaseproducten tenzij ze soortgelijke functie ondersteunen.



  1. Count(*) werkt niet goed

  2. Hoe de naam en de naam van de manager te krijgen

  3. MySQL-query om te zoeken naar items met bepaalde tags

  4. Toon alle databasenamen