Problem:
Du vill begränsa raderna i en SQL Server-resultatuppsättning.
Exempel:
Vår databas har en tabell som heter toy
med data i kolumnerna id
, name
och price
.
id | namn | pris |
---|---|---|
161 | Bike BMX | 200,00 |
121 | Roboten Tobie | 185,50 |
213 | Fiskelek | 25.00 |
102 | Djurpussel | 45,80 |
111 | Race Track Set | 126,70 |
233 | Easy Bricks | 21.00 |
Låt oss välja leksakers namn och priser. Men vi behöver bara se de första fem raderna.
Lösning 1:
SELECT name, price FROM toy ORDER BY price OFFSET 0 ROWS FETCH FIRST 5 ROWS ONLY;
Här är resultatet av frågan:
namn | pris |
---|---|
Easy Bricks | 21.00 |
Fiskelek | 25.00 |
Djurpussel | 45,80 |
Race Track Set | 126,70 |
Robot Tobie | 185,50 |
Diskussion:
För att begränsa rader i resultatuppsättningen, använd ORDER BY med de valfria OFFSET- och FETCH-satserna. Först sorterar frågan raderna (ORDER BY). Du talar sedan om för SQL Server vilken som ska vara den första raden i resultatuppsättningen (OFFSET...ROWS) och hur många rader som ska returneras (FETCH...ONLY).
OFFSET-satsen placeras omedelbart efter ORDER BY. Heltalet indikerar den första raden som ska räknas (i SQL Server är den första raden 0, den andra raden är 1, etc.), följt av nyckelordet ROW eller ROWS. Du kan använda antingen RAD eller RAD, men det rekommenderas att använda RAD för 1 rad och RAD för 0 och flera rader. Titta på bilden:
I vårt exempel sorterar vi efter pris (ORDER BY price
) och börja returnera resultat från den första raden (OFFSET 0 ROWS
). Sedan använder vi FETCH med sökordet FIRST. Du kan använda FIRST eller NEXT; det rekommenderas att använda FIRST om du börjar från första raden utan att utelämna några poster och NÄSTA om några rader utelämnas (dvs om OFFSET är större än 0).
Slutligen har vi antalet rader att välja och nyckelordet ROWS ONLY. Använd ENDAST RADER om du returnerar flera rader och ENDAST RADER begränsar du resultatet till en rad. I vårt exempel begränsar vi det till fem rader (FETCH FIRST 5 ROWS ONLY
).
Nedan har vi en annan fråga som begränsar rader till fem men börjar från den femte raden i tabellen (OFFSET 4 ROWS
):
Lösning 2:
SELECT name, price FROM toy ORDER BY price OFFSET 4 ROWS FETCH NEXT 5 ROWS ONLY;
Här är resultatet av frågan:
namn | pris |
---|---|
Roboten Tobie | 185,50 |
Bike BMX | 200,00 |
Observera att denna fråga endast returnerar två rader, inte de fem som anges. Titta på bilden:
Varför bara två rader? Eftersom den här tabellen bara innehåller sex poster. Om vi utelämnar de fyra första raderna och börjar på rad 5, återstår bara två rader.
SQL Server har ett annat sätt att begränsa rader:TOP-satsen.
Lösning 3:
SELECT TOP 3 name, price FROM toy ORDER BY price;
Här är resultatet av frågan:
namn | pris |
---|---|
Easy Bricks | 21.00 |
Fiskelek | 25.00 |
Djurpussel | 45,80 |
Om du inte behöver utelämna några rader kan du använda SQL Servers TOP-sats för att begränsa antalet returnerade rader. Den placeras omedelbart efter SELECT. Nyckelordet TOP följs av ett heltal som anger antalet rader som ska returneras. I vårt exempel ordnade vi efter pris och begränsade sedan de returnerade raderna till 3.
Till skillnad från OFFSET – FETCH-metoden kräver TOP inte BESTÄLLNING EFTER. Här är ett liknande exempel, men utan att sortera posterna:
Lösning 4:
SELECT TOP 3 name, price FROM toy;
Här är resultatet av frågan:
Observera att olika poster har returnerats. Vanligtvis (men inte alltid) kommer raderna att visas i den ordning posterna infogades i tabellen.
Vi rekommenderar att du använder OFFSET och FETCH istället för TOP, eftersom OFFSET och FETCH är SQL-standard; TOP är specifik för T-SQL.