Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL ред по елементи от IN клауза

Въпреки че вашата логика и горните решения са добри за малък мащаб, ако говорите за повече от 65 000 елемента, имате нужда от решение, което е мащабируемо.

Моето предложение е да разделите тази задача на 2 стъпки.

Стъпка 1

Създайте временна таблица. Тази временна таблица ще има минимум 3 колони

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

Всеки път, когато потребителят поръчва такава заявка, вмъквайте данни, т.е. идентификационни номера на елементи и техния номер на последователност в тази временна таблица с някакъв уникален ключ за идентифициране на потребителска сесия (евентуално потребителски идентификатор или идентификатор на сесия). Този трик е да се избегне сблъсък на списъци с елементи, когато множество потребители едновременно задействат отчети.

Стъпка 2

Сега задействайте вашата заявка за отчет, присъединявайки се към вашата основна таблица, временна таблица с session_key . В данните за реда на заявката въз основа на вашия входен ред (вече съхранен във временната таблица)

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

Този метод е

  1. агностик на база данни
  2. мащабируем с произволен брой входове
  3. Осигурява възможно най-добра производителност

Забележка:За да подобрите допълнително производителността на заявката, създайте индекс на session_key, item_id във временната таблица също създайте индекс на item_id в таблицата ITEM (ако вече не съществува)

Редактиране:Oracle предлага Глобална временна таблица функция, която създава, има функции за разрешаване на записи само в сесия и автоматично почистване при извършване/край на сесия и т.н. Можете да използвате тази функция и да избегнете сесийния ключ, но това решение не може да бъде възпроизведено в други продукти за бази данни, освен ако те поддържа подобна функция.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предоставя ли Oracle начин за връщане на множество поднизове от ред на низ/clob, който е анализиран?

  2. oracle plsql:как да анализирате XML и да го вмъкнете в таблица

  3. Получавам грешка ORA-01775:циклична верига от синоними, когато използвам sqlldr

  4. Първи стъпки с Oracle LiveSQL

  5. Генериране на отделни редове за всеки месец в период от време