Jaký je rozdíl mezi TOP a OFFSET & Fetch?

Lze použít jak TOP, tak OFFSET & FETCH omezit počet vrácených řádků. OFFSET a FETCH mohou vrátit podobné výsledky na začátek, ale existují rozdíly, které mohou ovlivnit, která metoda je pro danou situaci nejvhodnější použít.

Všechny příklady této lekce jsou založeny na Microsoft SQL Server Management Studio a databáze AdventureWorks2012. Tyto bezplatné nástroje můžete začít používat pomocí mého průvodce Začínáme s používáním serveru SQL Server.

Jaký je rozdíl mezi TOP a OFFSET & Načíst?

V následujících částech se zabýváme TOP a OFFSET & FETCH. Myslím, že jakmile si přečtete obě části, pochopíte jejich rozdíly. Ty jsou také shrnuty v tabulce na konci tohoto článku.

Horní

TOP se používá k vrácení konkrétního počtu řádků z výsledku dotazu.

Klauzule TOP je již nějakou dobu k dispozici ve starších verzích serveru SQL, jako je SQL 2005. TOP není kompatibilní s ANSI a jeho použití je omezeno na produkty společnosti Microsoft, jako je SQL Server a MS-Access.

Klauzule TOP se používá v seznamu sloupců příkazu SELECT a lze ji použít s nebo bez příkazu OBJEDNAT.

Například pro výběr deseti nejméně nákladných produktů použijte

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

Ačkoli příkaz OBJEDNÁVKA není vyžadován, je nejlepší postup, protože bez něj nemáte žádnou záruku, za které řádky budou vráceny.

Jedna položka jedinečná pro TOP je schopnost vrátit procento řádků. Prohlášení

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

vrací prvních 51 produktů s nejnižší cenou StandardCost (tj. 504 řádků x 10% = 50,4, zaokrouhleno nahoru na 51).

Můžete také vybrat zadaný počet záznamů ze spodní části výsledku dotazu. Chcete-li to provést, můžete použít trik k seřazení záznamů v sestupném pořadí, a to takto:

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

Mějte na paměti, že když jsou výsledky seřazeny v sestupném pořadí, největší částky jsou vráceny jako první. Z tohoto důvodu TOP vrací ty produkty s nejvyššími standardními náklady.

TOP může být velmi užitečný při velkých výsledcích, protože vrácení tisíců řádků může ovlivnit výkon. V mnoha případech používá pouze procházení počáteční části výsledků.

TOP může zobrazit vazby vale – WITH TIES umožňuje také zobrazit další záznamy, které mají stejnou hodnotu jako poslední řádek od základního výsledku.

OFFSET a FETCH

OFFSET a FETCH se používají k vrácení okna záznamů ze sady výsledků. OFFSET určuje, kolik řádků ve výsledku přeskočit, a FETCH určuje, kolik řádků od tohoto bodu vpřed se má vrátit do výsledku.

OFFSET a FETCH byly nedávno zavedeny v SQL Server 2012 a jsou kompatibilní s ANSI.

OFFSET můžete použít bez FETCH, ale FETCH nelze použít sám. Bez ohledu na to musí být OFFSET použit s klauzulí ORDER BY. Důvod je jednoduchý, protože OFFSET a FETCH jsou součástí klauzule ORDER BY.

V tomto příkladu je přeskočeno prvních deset řádků výsledku, poté se ve výsledku zobrazí dalších 10.

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

Řádky vrácené z TOP můžete replikovat pomocí OFFSET a FETCH za předpokladu, že jsou výsledky seřazeny. Následující příkaz je stejný jako vrácení TOP 10:

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

Když je hodnota OFFSET nastavena na 0, nebudou přeskočeny žádné řádky.

Na rozdíl NAHORU, s OFFSETem nejsou zabudovány prostředky k vrácení procenta řádků. Můžete však použít vlastní výpočet tak, že vypočítáte procento takto:

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

Trik je v poddotazu. Vypočítáním počtu řádků ve výsledku můžeme získat procentní podíl. Tady je poddotaz. Pokud si přejete, můžete to spustit v SQL Server Management Studio.

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

Existuje několik položek na vědomí:

  • STROP zaokrouhlí čísla nahoru. V našem příkladu CEILING (50,4) vrací 51,0. Toto napodobuje chování TOP.
  • FETCH vyžaduje celočíselnou hodnotu, takže k provedení této konverze se použije CAST. 51.0 se tedy stává 51

Chcete-li vrátit posledních 10 záznamů výsledku, existují dvě metody. Můžeme obrátit pořadí řazení tak, jak jsme to udělali pro TOP:

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

Nebo můžeme zachovat pořadí řazení a vypočítat posun tak, že všechny řádky až po poslední deset je přeskočeno. Tuto techniku podrobněji prozkoumáme v lekci SQL o OFFSET a FETCH.

Shrnutí rozdílů

Zde je souhrn některých hlavních rozdílů mezi TOP a OFFSET & FETCH.

Porovnání TOP a OFFSET & FETCH

Obecně platí, že pokud je vaším cílem pouze vrátit prvních několik řádků, pak si myslím, že TOP je jednoduché řešení; Pokud hledáte stránkovací řešení nebo potřebujete vybrat řádky uprostřed nebo dole ve výsledcích dotazu, aniž by to ovlivnilo původní pořadí řazení, myslím, že OFFSET & FETCH jsou nejlepší.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *