Hva er forskjellen mellom TOP og OFFSET & Fetch?

Både TOP og OFFSET & FETCH kan brukes til å begrense antall rader som returneres. OFFSET og FETCH kan gi lignende resultater til toppen, men det er forskjeller som kan påvirke hvilken metode som er best for deg å bruke i din situasjon.

Alle eksemplene for denne leksjonen er basert på Microsoft SQL Server Management Studio og AdventureWorks2012-databasen. Du kan komme i gang med disse gratisverktøyene ved å bruke guiden min Komme i gang med SQL Server.

Hva er forskjellen mellom TOPP og OFFSET & Hent?

I de følgende avsnittene dekker vi TOP og OFFSET & FETCH. Jeg tror når du har lest begge delene, vil du forstå forskjellene deres. Disse er også oppsummert i en tabell på slutten av denne artikkelen.

Topp

TOPP brukes til å returnere et spesifikt antall rader fra et søkeresultat.

TOP-klausulen har vært tilgjengelig i noen tid i eldre versjoner av SQL-server, for eksempel SQL 2005. TOP er ikke ANSI-kompatibel, og bruken er mannlig begrenset til Microsoft-produkter som SQL Server og MS-Access.

TOP-setningen brukes i SELECT-setningens kolonneliste og kan brukes med eller uten ORDER BY.

For eksempel for å velge de ti minst kostbare produktene, bruk

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

Selv om BESTILLING BY ikke er påkrevd, er det best praksis, som uten den har du ingen garanti for hvilke rader som returneres.

Ett element som er unikt for TOPP er muligheten til å returnere en prosentandel av rader. Uttalelsen

SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost

returnerer de 51 beste produktene med lavest Standardkostnad (dvs. 504 rader x 10% = 50,4, avrundet opp til 51).

Du kan også velge spesifisert antall poster fra bunnen av et søkeresultat. For å gjøre dette kan du bruke et triks for å bestille postene i synkende rekkefølge slik:

SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC

Husk når resultatene er sortert i synkende rekkefølge, største beløp returneres først. På grunn av dette returnerer TOP de produktene med den høyeste standardkostnaden.

TOP kan være veldig nyttig på store resultater, da retur av tusenvis av rader kan påvirke ytelsen. I mange tilfeller vil bruksområder bare bla gjennom begynnelsesdelen av resultatene.

TOPP kan vise tie vale – WITH TIES lar deg også vise flere poster som har samme verdi som den siste raden fra basisresultatet. / p>

OFFSET og FETCH

OFFSET og FETCH brukes til å returnere et vindu med poster fra et resultatsett. OFFSET spesifiserer hvor mange rader som skal hoppes over i resultatet, og FETCH spesifiserer hvor mange rader fra det punktet og fremover for å returnere i resultatet.

OFFSET og FETCH ble nylig introdusert i SQL Server 2012 og er ANSI-kompatible. / p>

Du kan bruke OFFSET uten FETCH, men FETCH kan ikke brukes av seg selv. Uansett må OFFSET brukes med en ORDER BY-klausul. Årsaken er enkel da OFFSET og FETCH er en del av ORDER BY-setningen.

I dette eksemplet hoppes de første ti radene over resultatet, og deretter vises de neste 10 i resultatet.

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

Du kan replikere radene som er returnert fra TOP ved hjelp av OFFSET og FETCH forutsatt at resultatene er bestilt. Følgende uttalelse er den samme som å returnere TOPP 10:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

Når OFFSET er satt til 0, hoppes ingen rader over.

I motsetning til TOPP, med OFFSET er det ikke innebygde midler for å returnere en prosentandel av rader. Du kan imidlertid rulle selv ved å beregne prosentandelen slik:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT (SELECT CAST(CEILING(COUNT(*) * .1) as INT) FROM Production.Product) ROWS ONLY

Trikset er i underspørringen. Ved å beregne antall rader i resultatet kan vi oppnå en prosentandel. Her er underforespørselen. Hvis du ønsker det, kan du kjøre dette i SQL Server Management Studio.

SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product

Det er flere elementer å merke seg:

  • TAK runder tall opp. I vårt eksempel CEILING (50.4) returnerer 51.0. Dette etterligner oppførselen til TOP.
  • FETCH krever et heltall slik at CAST brukes til å gjøre den konverteringen. Dermed blir 51.0, 51

For å returnere de 10 nederste postene for et resultat er det to metoder. Vi kan reversere sorteringsrekkefølgen slik vi gjorde for TOPP:

SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

Eller vi kan bevare sorteringsrekkefølgen og beregne forskyvningen slik at alle rader opp til siste ti hoppes over. Vi utforsker denne teknikken mer detaljert i SQL-leksjonen om OFFSET og FETCH.

Oppsummering av forskjeller

Her er en oppsummering av noen den største forskjellen mellom TOP og OFFSET & FETCH.

Sammenligning av TOPP til OFFSET & FETCH

Generelt sett, hvis målet ditt er å bare returnere de første flere radene, så tror jeg TOPP er en enkel løsning, men; hvis du leter etter en personsøkingsløsning, eller har behov for å velge rader i midten eller bunnen av søkeresultatene uten å påvirke den opprinnelige sorteringsrekkefølgen, så tror jeg OFFSET & FETCH er best.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *