Не съм сигурен дали искате:
- проверете дали ред, който ще вмъкнете, се припокрива с някои от съществуващите редове, или
- търсете във всички съществуващи редове и идентифицирайте тези, които се припокриват?
Ако (1), тогава това, което по същество вече правите...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
...ще ви даде припокривания и трябва да е много производителен, при условие че имате съставен индекс, чиито компоненти са срещу указания:{beginRange ASC, endRange DESC}
.
Ако (2), тогава можете да използвате прозорец по следния начин:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Това ще ви даде всеки диапазон, който се припокрива със следващия му диапазон (където значението на „следващ“ е дефинирано в контекста на beginRange
поръчване).
Строго казано, това дори не се нуждае от съставен индекс (освен ако не искате покриване
) - просто обикновен индекс на {beginRange}
трябва да осигури прилична производителност.