sql >> Base de Datos >  >> RDS >> Oracle

Comprobación de superposición más rápida de Oracle

No estoy seguro de si desea:

  1. verifique si una fila que está a punto de insertar se superpone con algunas de las filas existentes, o
  2. buscar en todas las filas existentes e identificar las que se superponen?

Si (1), entonces lo que esencialmente ya estás haciendo...

SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;

... le dará superposiciones y debería tener un gran rendimiento, siempre que tenga un índice compuesto cuyos componentes estén en opuesto direcciones:{beginRange ASC, endRange DESC} .

Si (2), entonces puede utilizar ventanas como esta:

SELECT *
FROM (
    SELECT
        YOUR_TABLE.*,
        LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
    FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;

Esto le dará todos los rangos que se superponen con su siguiente rango (donde el significado de "siguiente" se define en el contexto de beginRange pedidos).

Estrictamente, esto ni siquiera necesita un índice compuesto (a menos que desee cubriendo ) - solo un índice simple en {beginRange} debería garantizar un rendimiento decente.