Jeg er ikke sikker på, om du vil:
- kontroller, om en række, du er ved at indsætte, overlapper nogle af de eksisterende rækker, eller
- søge gennem alle de eksisterende rækker og identificere dem, der overlapper?
Hvis (1), så gør du i det væsentlige allerede...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
... vil give dig overlapninger og bør være meget effektiv, forudsat at du har et sammensat indeks, hvis komponenter er i modsat retninger:{beginRange ASC, endRange DESC}
.
Hvis (2), så kan du bruge vinduer som dette:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Dette vil give dig ethvert område, der overlapper med dets næste område (hvor betydningen af "næste" er defineret i sammenhæng med beginRange
bestilling).
Dette kræver strengt taget ikke engang et sammensat indeks (medmindre du ønsker dækning
) - bare et simpelt indeks på {beginRange}
skal sikre en anstændig ydeevne.