Nie wiem, czy chcesz:
- sprawdź, czy wiersz, który zamierzasz wstawić, nakłada się na niektóre z istniejących lub
- przeszukać wszystkie istniejące wiersze i zidentyfikować te, które się nakładają?
Jeśli (1), to co właściwie już robisz...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
... zapewni nakładanie się i powinien być bardzo skuteczny, pod warunkiem, że masz złożony indeks, którego składniki są przeciwne kierunki:{beginRange ASC, endRange DESC}
.
Jeśli (2), możesz wykorzystać okienkowanie w ten sposób:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
To da ci każdy zakres, który pokrywa się z jego następnym zakresem (gdzie znaczenie „następny” jest zdefiniowane w kontekście beginRange
zamawianie).
Ściśle rzecz biorąc, nie wymaga to nawet złożonego indeksu (chyba że chcesz pokrycie
) - po prostu prosty indeks na {beginRange}
powinien zapewnić przyzwoitą wydajność.