Tôi không chắc liệu bạn có muốn:
- kiểm tra xem hàng bạn sắp chèn có trùng lặp với một số hàng hiện có hay không, hoặc
- tìm kiếm qua tất cả các hàng hiện có và xác định những hàng trùng lặp?
Nếu (1), thì về cơ bản những gì bạn đang làm ...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
... sẽ cung cấp cho bạn các phần chồng chéo và phải rất hiệu quả, miễn là bạn có một chỉ mục tổng hợp có các thành phần đối lập với nhau chỉ đường:{beginRange ASC, endRange DESC}
.
Nếu (2), thì bạn có thể sử dụng cửa sổ như thế này:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Điều này sẽ cung cấp cho bạn mọi phạm vi trùng với phạm vi tiếp theo của nó (trong đó ý nghĩa của "tiếp theo" được xác định trong ngữ cảnh của beginRange
đặt hàng).
Nghiêm túc mà nói, điều này thậm chí không cần chỉ mục tổng hợp (trừ khi bạn muốn cover
) - chỉ là một chỉ mục đơn giản trên {beginRange}
sẽ đảm bảo hiệu suất tốt.