Även om din logik och ovanstående lösningar är bra för småskalighet, om du talar om mer än 65 000 artiklar behöver du en lösning som är skalbar.
Mitt förslag är att dela upp denna uppgift i två steg.
Steg 1
Skapa en tillfällig tabell, den här temporära tabellen kommer att ha minst 3 kolumner
TEMP_ITEM_ORDER_TABLE (
session_key varchar2(50),
item_id number,
item_report_order number
)
Varje gång en användare beställer en sådan fråga, infoga data, dvs artikel-ID och deras sekvensnummer i denna temporära tabell med någon unik nyckel för att identifiera användarsession (möjligen användar-ID eller sessions-ID). Det här tricket är att undvika kollision av objektlistor när flera användare samtidigt avfyrar rapporter.
Steg 2
Avfyra nu din rapportfråga och ansluter till din huvudtabell, temporära tabell med session_key
. I frågeorderdata baserat på din indataorder (lagrade redan i temptabellen)
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
Denna metod är
- databasagnostiker
- skalbar med valfritt antal ingångar
- Ger bästa möjliga prestanda
Obs:För att ytterligare förbättra frågeprestanda, skapa index på session_key, item_id i temp-tabellen skapa även index på item_id på ITEM-tabellen (om det inte redan finns)
Edit:Oracle erbjuder Global Temporary Table funktion, som skapar har funktioner för att endast tillåta poster med i session och automatisk rensning vid commit/slut av session etc. Du kan använda denna funktion och undvika sessionsnyckel, men den här lösningen kan inte replikeras på andra databasprodukter om de inte stöder liknande funktion.