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

Verificação de sobreposição mais rápida do Oracle


Não tenho certeza se você quer:
  1. verifique se uma linha que você está prestes a inserir se sobrepõe a algumas das linhas existentes ou
  2. pesquisar em todas as linhas existentes e identificar aquelas que se sobrepõem?

Se (1), então o que você essencialmente já está fazendo...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;

...terá sobreposições e deve ter um desempenho muito bom, desde que você tenha um índice composto cujos componentes estejam em opostos direções:{beginRange ASC, endRange DESC} .

Se (2), então você pode utilizar janelas como esta:
SELECT *
FROM (
    SELECT
        YOUR_TABLE.*,
        LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
    FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;

Isso lhe dará todos os intervalos que se sobrepõem ao seu próximo intervalo (onde o significado de "próximo" é definido no contexto de beginRange encomenda).

Estritamente, isso nem precisa de um índice composto (a menos que você queira cobrindo ) - apenas um índice simples em {beginRange} deve garantir um desempenho decente.