Ik weet niet zeker of je het volgende wilt:
- controleer of een rij die u gaat invoegen overlapt met enkele van de bestaande rijen, of
- alle bestaande rijen doorzoeken en de overlappende rijen identificeren?
Indien (1), wat doet u dan in wezen al...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
...geeft u overlappingen en zou zeer goed moeten presteren, op voorwaarde dat u een samengestelde index heeft waarvan de componenten tegenover staan routebeschrijving:{beginRange ASC, endRange DESC}
.
Indien (2), dan kunt u vensters als volgt gebruiken:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Dit geeft je elk bereik dat overlapt met het volgende bereik (waarbij de betekenis van "volgende" is gedefinieerd in de context van beginRange
bestellen).
Strikt genomen heeft dit niet eens een samengestelde index nodig (tenzij u covering
) - gewoon een simpele index op {beginRange}
moet zorgen voor behoorlijke prestaties.