sql >> Databasteknik >  >> RDS >> Oracle

Oracle snabbare överlappningskontroll

Jag är inte säker på om du vill:

  1. kontrollera om en rad som du ska infoga överlappar några av de befintliga raderna, eller
  2. söka igenom alla befintliga rader och identifiera de som överlappar?

Om (1), vad du i princip redan gör...

SELECT *
FROM YOUR_TABLE
WHERE :inputEnd > beginRange AND :inputStart < endRange;

...ger dig överlappningar och bör vara mycket presterande, förutsatt att du har ett sammansatt index vars komponenter är motsatta vägbeskrivning:{beginRange ASC, endRange DESC} .

Om (2) kan du använda fönster så här:

SELECT *
FROM (
    SELECT
        YOUR_TABLE.*,
        LEAD(beginRange) OVER (ORDER BY beginRange) nextBeginRange
    FROM YOUR_TABLE
)
WHERE endRange > nextBeginRange;

Detta ger dig alla intervall som överlappar med nästa intervall (där betydelsen av "nästa" definieras i sammanhanget beginRange beställning).

Det här kräver strikt sett inte ens ett sammansatt index (såvida du inte vill ha täckning ) - bara ett enkelt index på {beginRange} bör säkerställa anständig prestanda.



  1. vad är den bästa metoden för att göra obegränsade underkategorier

  2. Hur skapar man en Oracle-sekvens som börjar med maxvärde från en tabell?

  3. Anslutningssträngparametrar för textfilkällor

  4. #1064 - Du har ett fel i din SQL-syntax; kontrollera manualen som motsvarar din MySQL-serverversion