Nejsem si jistý, zda chcete:
- zkontrolujte, zda se řádek, který se chystáte vložit, nepřekrývá s některými ze stávajících řádků, nebo
- prohledejte všechny existující řádky a identifikujte ty, které se překrývají?
Pokud (1), pak to, co v podstatě již děláte...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
...poskytne vám přesahy a měl by být velmi výkonný za předpokladu, že máte složený index, jehož složky jsou opačně směry:{beginRange ASC, endRange DESC}
.
Pokud (2), pak můžete použít okno takto:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Získáte tak každý rozsah, který se překrývá s jeho dalším rozsahem (kde význam „další“ je definován v kontextu beginRange
objednávání).
Přísně to ani nepotřebuje složený index (pokud nechcete krytí
) - jen jednoduchý index na {beginRange}
by měl zajistit slušný výkon.