Non sono sicuro che tu voglia:
- controlla se una riga che stai per inserire si sovrappone ad alcune righe esistenti, oppure
- cerca in tutte le righe esistenti e identifica quelle che si sovrappongono?
Se (1), allora cosa stai già facendo essenzialmente...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
...ti darà sovrapposizioni e dovrebbe essere molto performante, a condizione che tu abbia un indice composito i cui componenti siano in opposto indicazioni:{beginRange ASC, endRange DESC}
.
Se (2), puoi utilizzare il windowing in questo modo:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Questo ti darà ogni intervallo che si sovrappone al suo intervallo successivo (dove il significato di "next" è definito nel contesto di beginRange
ordinazione).
A rigor di termini, questo non ha nemmeno bisogno di un indice composito (a meno che tu non voglia copertura
) - solo un semplice indice su {beginRange}
dovrebbe garantire prestazioni decenti.