sql >> Databáze >  >> RDS >> Oracle

Pořadí SQL podle prvků z klauzule IN

Zatímco vaše logika a výše uvedená řešení jsou dobrá pro malé měřítko, pokud mluvíte o více než 65 000 položkách, potřebujete řešení, které je škálovatelné.

Můj návrh je rozdělit tento úkol na 2 kroky.

Krok 1

Vytvořte dočasnou tabulku, tato dočasná tabulka bude mít minimálně 3 sloupce

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

Pokaždé, když uživatel objedná takový dotaz, vložte data, tj. ID položek a jejich sekvenci no do této dočasné tabulky s nějakým jedinečným klíčem k identifikaci uživatelské relace (možná ID uživatele nebo ID relace). Tento trik má zabránit kolizi seznamů položek, když několik uživatelů současně spustí hlášení.

Krok 2

Nyní spusťte dotaz sestavy a spojte svou hlavní tabulku, dočasnou tabulku s session_key . V dotazu data objednávky na základě vaší vstupní objednávky (již uložená v dočasné tabulce)

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

Tato metoda je

  1. databázový agnostik
  2. škálovatelné s libovolným počtem vstupů
  3. Poskytuje nejlepší možný výkon

Poznámka:Chcete-li dále zlepšit výkon dotazů, vytvořte index pro session_key, item_id v dočasné tabulce také vytvořte index pro item_id v tabulce ITEM (pokud již neexistuje)

Edit:Oracle nabízí Globální dočasný stůl funkce, která vytváří, má funkce umožňující záznamy pouze v relaci a automatické čištění při odevzdání/konci relace atd. Tuto funkci můžete využít a vyhnout se klíči relace, ale toto řešení nelze replikovat na jiné databázové produkty, pokud podporovat podobnou funkci.



  1. ORA-01840:vstupní hodnota není dostatečně dlouhá pro formát data v Oracle Insert pomocí Select

  2. Jak se mohu připojit k databázi MySQL pomocí Scala?

  3. Nelze získat jarní spouštění pro automatické vytvoření schématu databáze

  4. Nesprávné dvojité hodnoty vrácené z mysql do java