Atât TOP cât și OFFSET & FETCH limitați numărul de rânduri returnate. OFFSET și FETCH pot întoarce rezultate similare la început, dar există diferențe care pot influența metoda cea mai potrivită pentru dvs. în situația dată.
Toate exemplele acestei lecții se bazează pe Microsoft SQL Server Management Studio și baza de date AdventureWorks2012. Puteți începe să utilizați aceste instrumente gratuite folosind Ghidul meu Introducere în utilizarea SQL Server.
Care este diferența dintre TOP și OFFSET & Preluare?
În următoarele secțiuni acoperim TOP și OFFSET & FETCH. Cred că odată ce citiți ambele secțiuni, veți înțelege diferențele dintre acestea. Acestea sunt, de asemenea, rezumate într-un tabel de la sfârșitul acestui articol.
Sus
TOP este utilizat pentru a returna un anumit număr de rânduri dintr-un rezultat al interogării.
Clauza TOP este disponibilă de ceva timp în versiunile mai vechi de SQL Server, cum ar fi SQL 2005. TOP nu este conform ANSI și utilizarea sa este limitată în mod masculin la produse Microsoft precum SQL Server și MS-Access.
Clauza TOP este utilizată în lista de coloane a instrucțiunii SELECT și poate fi utilizată cu sau fără ORDER BY.
De exemplu, pentru a selecta cele mai puțin costisitoare 10 produse utilizați
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
Deși ORDER BY nu este necesar, este cea mai bună practică, deoarece fără acesta, nu aveți nicio garanție pentru rândurile returnate.
Un articol unic pentru TOP este capacitatea de a returna un procent de rânduri. Declarația
SELECT TOP 10 PERCENT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost
returnează primele 51 de produse cu standardCost cel mai scăzut (adică 504 rânduri x 10% = 50,4, rotunjite la 51).
De asemenea, puteți selecta numărul specificat de înregistrări din partea de jos a rezultatului unei interogări. Pentru a face acest lucru, puteți utiliza un truc pentru a ordona înregistrările în ordine descrescătoare astfel:
SELECT TOP 10 Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC
Rețineți când rezultatele sunt sortate în ordine descrescătoare, cele mai mari sume sunt returnate mai întâi. Din acest motiv, TOP returnează acele produse cu cel mai ridicat cost standard.
TOP poate fi foarte util pentru rezultate mari, deoarece returnarea a mii de rânduri poate afecta performanța. În multe cazuri utilizările vor răsfoi doar porțiunea inițială a rezultatelor.
TOP poate afișa legăturile vale – CU TIES vă permite să afișați și înregistrări suplimentare care au aceeași valoare ca ultimul rând din rezultatul de bază.
OFFSET și FETCH
OFFSET și FETCH sunt utilizate pentru a returna o fereastră de înregistrări dintr-un set de rezultate. OFFSET specifică câte rânduri să se omită în rezultat, iar FETCH specifică câte rânduri din acel punct înainte să revină în rezultat.
OFFSET și FETCH au fost introduse recent în SQL Server 2012 și sunt conforme cu ANSI.
Puteți utiliza OFFSET fără FETCH, dar FETCH nu poate fi folosit de unul singur. Indiferent, OFFSET trebuie utilizat împreună cu o clauză ORDER BY. Motivul este simplu deoarece OFFSET și FETCH fac parte din clauza ORDER BY.
În acest exemplu, primele zece rânduri ale rezultatului sunt omise, apoi următoarele 10 afișate în rezultat.
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
Puteți replica rândurile returnate din TOP folosind OFFSET și FETCH, cu condiția ca rezultatele să fie ordonate. Următoarea declarație este aceeași cu returnarea TOP 10:
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
Când OFFSET este setat la 0 nu se omit rânduri.
Spre deosebire de TOP, cu OFFSET nu există mijloace încorporate pentru a returna un procent de rânduri. Cu toate acestea, vă puteți rula propriul calculând procentajul astfel:
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
Trucul se află în subconsultare. Calculând numărul de rânduri din rezultat, putem obține apoi un procent. Iată subconsultarea. Dacă doriți, puteți rula acest lucru în SQL Server Management Studio.
SELECT CAST(CEILING(COUNT(*) * .1) as INT)FROM Production.Product
Există mai multe elemente de notat:
- CEILING rotunjește numerele în sus. În exemplul nostru CEILING (50.4) returnează 51.0. Aceasta imită comportamentul TOP.
- FETCH necesită o valoare întreagă, astfel încât CAST este utilizat pentru a face acea conversie. Astfel 51.0 devine, 51
Pentru a returna primele 10 înregistrări ale unui rezultat există două metode. Putem inversa ordinea de sortare așa cum am făcut pentru TOP:
SELECT Name, ProductNumber, StandardCostFROM Production.ProductORDER BY StandardCost DESC OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
Sau putem păstra ordinea de sortare și putem calcula decalajul astfel încât toate rândurile până la ultimul zece sunt omise. Explorăm această tehnică mai detaliat în lecția SQL despre OFFSET și FETCH.
Rezumatul diferențelor
Iată un rezumat al diferenței majore dintre TOP și OFFSET & FETCH.
În general, dacă scopul dvs. este să returnați primele mai multe rânduri, atunci cred că TOP este o soluție simplă; dacă sunteți în căutarea unei soluții de paginare sau aveți nevoie să selectați rânduri în mijlocul sau în partea de jos a rezultatelor interogării fără a afecta ordinea de sortare originală, atunci cred că OFFSET & FETCH sunt cele mai bune.