Vad är skillnaden mellan TOP och OFFSET & Fetch?

Både TOP och OFFSET & FETCH kan användas för att begränsa antalet rader som returneras. OFFSET och FETCH kan ge liknande resultat överst, men det finns skillnader som kan påverka vilken metod som är bäst för dig att använda i din givna situation.

Alla exempel för den här lektionen är baserade på Microsoft SQL Server Management Studio och AdventureWorks2012-databasen. Du kan komma igång med dessa gratisverktyg med min guide Komma igång med SQL Server.

Vad är skillnaden mellan TOP och OFFSET & Hämta?

I följande avsnitt täcker vi TOP och OFFSET & FETCH. Jag tror att när du läst båda avsnitten kommer du att förstå deras skillnader. Dessa sammanfattas också i en tabell i slutet av den här artikeln.

Topp

TOP används för att returnera ett specifikt antal rader från ett frågeresultat.

TOP-klausulen har funnits länge i äldre versioner av SQL-servern, till exempel SQL 2005. TOP är inte ANSI-kompatibel och dess användning är manuellt begränsad till Microsoft-produkter som SQL Server och MS-Access.

TOP-klausulen används i SELECT-satsens kolumnlista och kan användas med eller utan en ORDER BY.

Till exempel för att välja de tio billigaste produkterna som används

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

Även om ORDER BY inte krävs, är det bästa praxis, utan utan den har du ingen garanti för vilka rader som returneras.

Ett objekt som är unikt för TOP är möjligheten att returnera en procentsats av rader. Uttalandet

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

returnerar de 51 bästa produkterna med lägsta Standardkostnad (dvs. 504 rader x 10% = 50,4, avrundade upp till 51).

Du kan också välja specificerat antal poster längst ner i ett sökresultat. För att göra detta kan du använda ett trick för att ordna posterna i fallande ordning enligt följande:

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

Kom ihåg när resultaten sorteras i fallande ordning, största beloppen returneras först. På grund av detta returnerar TOP de produkterna med den högsta standardkostnaden.

TOP kan vara mycket användbart vid stora resultat eftersom retur av tusentals rader kan påverka prestandan. I många fall kommer användningen bara att bläddra i början av resultaten.

TOP kan visa band vale – WITH TIES låter dig också visa ytterligare poster som har samma värde som den sista raden från basresultatet.

OFFSET och FETCH

OFFSET och FETCH används för att returnera ett fönster med poster från en resultatuppsättning. OFFSET anger hur många rader som ska hoppas över i resultatet och FETCH anger hur många rader från och med den punkten som ska returneras i resultatet.

OFFSET och FETCH introducerades nyligen i SQL Server 2012 och är ANSI-kompatibla. / p>

Du kan använda OFFSET utan FETCH, men FETCH kan inte användas av sig själv. Oavsett måste OFFSET användas med en ORDER BY-klausul. Anledningen är enkel eftersom OFFSET och FETCH är en del av ORDER BY-klausulen.

I det här exemplet hoppas de första tio raderna över resultatet, sedan visas de tio nästa i resultatet.

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

Du kan replikera raderna som returneras från TOP med OFFSET och FETCH förutsatt att resultaten är ordnade. Följande uttalande är detsamma som att returnera TOPP 10:

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

När OFFSET är inställt på 0 hoppas inga rader över.

Till skillnad från TOPP, med OFFSET finns inte inbyggda medel för att returnera en procentsats av rader. Du kan dock rulla din egen genom att beräkna procentsatsen så:

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 finns i underfrågan. Genom att beräkna antalet rader i resultatet kan vi sedan få en procentsats. Här är underfrågan. Om du vill kan du köra detta i SQL Server Management Studio.

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

Det finns flera objekt att notera:

  • TAK runder upp siffrorna. I vårt exempel CEILING (50.4) returnerar 51.0. Detta efterliknar TOP: s beteende.
  • FETCH kräver ett heltal så CAST används för att göra den konverteringen. Således blir 51.0, 51

För att returnera de 10 nedre posterna för ett resultat finns det två metoder. Vi kan vända sorteringsordningen som vi gjorde för TOP:

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

Eller så kan vi bevara sorteringsordningen och beräkna förskjutningen så att alla rader upp till den sista tio hoppas över. Vi utforskar denna teknik mer detaljerat i SQL-lektionen om OFFSET och FETCH.

Sammanfattning av skillnader

Här är en sammanfattning av några av de största skillnaderna mellan TOP och OFFSET & FETCH.

Jämförelse av TOPP till OFFSET & FETCH

I allmänhet, om ditt mål är att bara returnera de första flera raderna, tror jag dock att TOP är en enkel lösning; om du letar efter en personsökarlösning eller har ett behov av att välja rader i mitten eller botten av sökresultaten utan att påverka den ursprungliga sorteringsordningen, så tror jag OFFSET & FETCH är bäst.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *