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 é
- banco de dados agnóstico
- escalável com qualquer número de entradas
- 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.