Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Ordem SQL por elementos da cláusula IN


Embora sua lógica e as soluções acima sejam boas para pequena escala, se você estiver falando de mais de 65.000 itens, precisará de uma solução escalável.

Minha sugestão é dividir essa tarefa em 2 etapas.

Etapa 1

Crie uma tabela temporária, esta tabela temporária terá no mínimo 3 colunas
TEMP_ITEM_ORDER_TABLE (
  session_key varchar2(50),
  item_id number,
  item_report_order number
)

Cada vez que o usuário solicita tal consulta, insira dados, ou seja, IDs de item e sua sequência não nesta tabela temporária com alguma chave exclusiva para identificar a sessão do usuário (possivelmente ID do usuário ou ID da sessão). Esse truque é evitar a colisão de listas de itens quando vários usuários disparam relatórios simultaneamente.

Etapa 2

Agora dispare sua consulta de relatório juntando sua tabela principal, tabela temporária com session_key . Nos dados do pedido de consulta com base no seu pedido de entrada (já armazenado na tabela temporária)
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

Este método é
  1. banco de dados agnóstico
  2. escalável com qualquer número de entradas
  3. Oferece o melhor desempenho possível

Nota:Para melhorar ainda mais o desempenho da consulta, crie um índice em session_key, item_id na tabela temporária também crie um índice em item_id na tabela ITEM (se ainda não existir)

Edit:a Oracle oferece Tabela temporária global recurso, que cria recursos para permitir registros apenas na sessão e limpeza automática no commit/final da sessão etc. Você pode usar esse recurso e evitar a chave de sessão, mas esta solução não pode ser replicada em outros produtos de banco de dados, a menos que eles suporte recurso semelhante.