Hvad er forskellen mellem TOP og OFFSET & Fetch?

Både TOP og OFFSET & FETCH kan bruges til begrænse antallet af returnerede rækker. OFFSET og FETCH kan returnere lignende resultater til toppen, men der er forskelle, der kan påvirke, hvilken metode der er bedst for dig at bruge i din givne situation.

Alle eksemplerne til denne lektion er baseret på Microsoft SQL Server Management Studio og AdventureWorks2012-databasen. Du kan komme i gang ved hjælp af disse gratis værktøjer ved hjælp af min guide Kom godt i gang ved hjælp af SQL Server.

Hvad er forskellen mellem TOP og OFFSET & Hent?

I de følgende sektioner dækker vi TOP og OFFSET & FETCH. Jeg tror, at når du først har læst begge sektioner, vil du forstå deres forskelle. Disse er også opsummeret i en tabel i slutningen af denne artikel.

Top

TOP bruges til at returnere et specifikt antal rækker fra et forespørgselsresultat.

TOP-klausulen har været tilgængelig i nogen tid i ældre versioner af SQL-server, såsom SQL 2005. TOP er ikke ANSI-kompatibel, og dens anvendelse er mandigt begrænset til Microsoft-produkter som SQL Server og MS-Access.

TOP-klausulen bruges i SELECT-sætningens kolonneliste og kan bruges med eller uden en ORDER BY.

For eksempel til at vælge de ti billigste produkter, der bruges

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

Selvom ORDER BY ikke er påkrævet, er det bedste praksis, da uden den har du ingen garanti for, hvilke rækker der returneres.

Én vare, der er unik for TOP er evnen til at returnere en procentdel af rækker. Påstanden

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

returnerer de 51 bedste produkter med den laveste StandardCost (dvs. 504 rækker x 10% = 50,4, afrundet op til 51).

Du kan også vælge specificeret antal poster fra bunden af et forespørgselsresultat. For at gøre dette kan du bruge et trick til at ordne poster i faldende rækkefølge som følger:

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

Husk, når resultaterne sorteres i faldende rækkefølge, største beløb returneres først. På grund af dette returnerer TOP disse produkter med de højeste standardomkostninger.

TOP kan være meget nyttigt ved store resultater, da returnering af tusinder af rækker kan påvirke ydeevnen. I mange tilfælde vil anvendelser bare gennemse begyndelsesdelen af resultaterne.

TOP kan vise bånd vale – WITH TIES giver dig også mulighed for at vise yderligere poster, der har den samme værdi som den sidste række fra basisresultatet.

OFFSET og FETCH

OFFSET og FETCH bruges til at returnere et vindue med poster fra et resultatsæt. OFFSET angiver, hvor mange rækker der skal springes over i resultatet, og FETCH angiver, hvor mange rækker fra dette punkt fremad for at vende tilbage i resultatet.

OFFSET og FETCH blev for nylig introduceret i SQL Server 2012 og er ANSI-kompatible. / p>

Du kan bruge OFFSET uden FETCH, men FETCH kan ikke bruges af sig selv. Uanset hvad skal OFFSET bruges med en ORDER BY-klausul. Årsagen er enkel, da OFFSET og FETCH er en del af ORDER BY-klausulen.

I dette eksempel springes de første ti rækker over resultatet over, hvorefter de næste 10 vises i resultatet.

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

Du kan replikere de rækker, der returneres fra TOP ved hjælp af OFFSET og FETCH, forudsat at resultaterne er bestilt. Følgende udsagn er den samme som at returnere TOP 10:

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

Når OFFSET er indstillet til 0, springes der ikke nogen rækker over.

I modsætning til TOPP, med OFFSET er der ikke indbyggede midler til at returnere en procentdel af rækker. Du kan dog rulle din egen ved at beregne procentdelen som sådan:

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

Tricket er i underforespørgslen. Ved at beregne antallet af rækker i resultatet kan vi derefter få en procentdel. Her er underforespørgslen. Hvis du ønsker det, kan du køre dette i SQL Server Management Studio.

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

Der er flere emner at bemærke:

  • Lofter afrunder tal op. I vores eksempel returnerer CEILING (50.4) 51.0. Dette efterligner TOPs opførsel.
  • FETCH kræver et heltal, så CAST bruges til at foretage denne konvertering. Således bliver 51.0, 51

For at returnere de nederste 10 poster for et resultat er der to metoder. Vi kan vende sorteringsrækkefølgen, som vi gjorde for TOP:

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

Eller vi kan bevare sorteringsrækkefølgen og beregne forskydningen således, at alle rækker op til den sidste ti springes over. Vi udforsker denne teknik mere detaljeret i SQL-lektionen om OFFSET og FETCH.

Oversigt over forskelle

Her er et resumé af nogle af de største forskelle mellem TOP og OFFSET & FETCH.

Sammenligning af TOP til OFFSET & FETCH

Generelt, hvis dit mål er at bare returnere de første flere rækker, så tror jeg TOP er en simpel løsning, dog; hvis du leder efter en personsøgningsløsning eller har brug for at vælge rækker i midten eller bunden af forespørgselsresultaterne uden at påvirke den oprindelige sorteringsrækkefølge, så tror jeg OFFSET & FETCH er bedst.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *