Saya tidak yakin apakah Anda ingin:
- periksa apakah baris yang akan Anda sisipkan tumpang tindih dengan beberapa baris yang ada, atau
- telusuri semua baris yang ada dan identifikasi baris yang tumpang tindih?
Jika (1), maka apa yang pada dasarnya sudah Anda lakukan...
SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;
...akan memberi Anda tumpang tindih dan harus sangat berkinerja, asalkan Anda memiliki indeks komposit yang komponennya berlawanan arah:{beginRange ASC, endRange DESC}
.
Jika (2), maka Anda dapat menggunakan windowing seperti ini:
SELECT *
FROM (
SELECT
YOUR_TABLE.*,
LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;
Ini akan memberi Anda setiap rentang yang tumpang tindih dengan rentang berikutnya (di mana arti "berikutnya" didefinisikan dalam konteks beginRange
memesan).
Sebenarnya, ini bahkan tidak memerlukan indeks komposit (kecuali jika Anda ingin meliputi
) - hanya indeks sederhana di {beginRange}
harus memastikan kinerja yang layak.