sql >> Databasteknik >  >> RDS >> Sqlserver

Filtrering efter OFFSET-FETCH-alternativ i Välj fråga - SQL Server / TSQL självstudie del 118

Scenario :

Du arbetar som SQL Server-utvecklare med frontend-utvecklingsteam. Frontend-teamet behöver implementera paginering. Förvirrad om paginering? Inga problem. Tänk på att titta på ditt kontoutdrag eller kreditkortsutdrag. Där applikationer bara visar 10 eller 20 poster per sida och du måste klicka på nästa för att se nästa poster. Det kallas paginering.

Nu förstår du paginering, frontend-utvecklingen behöver SQL-fråga från dig som kan användas för att returnera önskade resultat och de bör kunna skicka sidnummer för att returnera poster.


Lösning:

Det finns flera sätt att skriva pagineringsfrågor, ett av dem är att använda OFFSET FETCH-satsen. Du måste sortera posterna om du vill använda OFFSET FETCH.

Låt oss skapa en dbo.TotalSale-tabell och infoga några exempelposter. Jag har bara infogat 11 poster.

CREATE TABLE [dbo].[TotalSale]
    (
      [id] [int] NOT NULL ,
      [SalePersonFName] [varchar](100) NULL ,
      [SalePersonLName] [varchar](100) NULL ,
      [ProductName] [varchar](100) NULL ,
      [ItemsSold] [int] NULL ,
      [SoldPrice] [float] NULL ,
      [SoldDate] [date] NULL ,
      [City] [varchar](100) NULL ,
      [State] [varchar](100) NULL ,
      [Country] [varchar](100) NULL ,
      [Region] [varchar](100) NULL
    )

INSERT  [dbo].[TotalSale]
        ( [id], [SalePersonFName], [SalePersonLName], [ProductName],
          [ItemsSold], [SoldPrice], [SoldDate], [City], [State], [Country],
          [Region] )
VALUES  ( 1, N'Aamir', N'Shahzad', N'TV', 1, 700, CAST(N'2015-07-15' AS DATE),
          N'Charlotte', N'NC', N'USA', N'North America' )
  ,     ( 2, N'M', N'Raza', N'Cell Phone', 2, 800, CAST(N'2015-07-15' AS DATE),
          N'Charlotte', N'NC', N'USA', N'North America' )
  ,     ( 3, N'Christy', N'Ladson', N'TV', 3, 1600,
          CAST(N'2015-04-02' AS DATE), N'High Point', N'NC', N'USA',
          N'North America' )
  ,     ( 4, N'John', N'Rivers', N'Laptop', 5, 2400,
          CAST(N'2014-03-09' AS DATE), N'Jersey City', N'NJ', N'USA',
          N'North America' )
  ,     ( 5, N'Najaf', N'Ali', N'Computer', 1, 300,
          CAST(N'2015-06-20' AS DATE), N'Karachi', N'Sindh', N'Pakistan',
          N'Asia' )
  ,     ( 6, N'Sukhjeet', N'Singh', N'TV', 2, 900, CAST(N'2015-06-21' AS DATE),
          N'ChandiGar', N'Punjab', N'India', N'Asia' )
  ,     ( 7, N'Chirag', N'Patel', N'Cell Phone', 5, 1500,
          CAST(N'2015-06-23' AS DATE), N'AhmadAbad', N'Gujrat', N'India',
          N'Asia' )
  ,     ( 8, N'Aleena', N'Aman', N'Laptop', 2, 800,
          CAST(N'2015-05-25' AS DATE), N'Lahore', N'Punjab', N'Pakistan',
          N'Asia' )
  ,     ( 9, N'Petra', N'Henry', N'TV', 10, 5000, CAST(N'2015-04-08' AS DATE),
          N'Paris', N'Île-de-France', N'France', N'Europe' )
  ,     ( 10, N'Rita', N'Roger', N'Laptop', 7, 2100,
          CAST(N'2015-04-11' AS DATE), N'Paris', N'Île-de-France', N'France',
          N'Europe' )
  ,     ( 11, N'Tamara', N'Tony', N'Cell Phone', 2, 1200,
          CAST(N'2015-03-03' AS DATE), N'Frankfurt', N'Hesse', N'Germany',
          N'Europe' )
 
1) Låt oss säga att om vi vill hoppa över de första 5 raderna och vill visa alla övriga rader som vi kan använda nedanstående fråga.

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
          OFFSET 5 rows
Hur man använder OFFSET FETCH-klausulen i SQL Server för att hoppa över de första X raderna och visa alla resten av dem - SQL Server Tutorial

2) Om vi ​​nu vill visa 3 poster per sida kan vi använda nedanstående fråga. I det här fallet kommer vi att visa första sidan

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
         OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

Hur man använder OFFSET FETCH-satsen för att returnera poster per sida i SQL Server - SQL Server Tutorial

Märde att jag har OFFSET 0, det betyder att jag vill visa första sidan och med 3 rader. Om jag vill visa andra sidans poster, ställer jag in på OFFSET 1, nästa 3 rader kommer att förbli densamma som vill visa endast 3 rader per sida.

Vi kan använda variabler så att vi behöver inte göra ändringar i frågan och genom att ändra värdet på variabler kan vi returnera våra önskade resultat. Du kan skapa lagrad procedur om du vill genom att använda nedanstående fråga.

Declare @PageNumber int
Declare @RowsPerPage int
set @RowsPerPage=3
SET @PageNumber=1

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
         OFFSET (@PageNumber-1)*@RowsPerPage ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
 
Om vi ​​behöver tillhandahålla lagrad procedur till Front End-teamet, som accepterar sidnummer och antal rader som de vill returnera för varje sida, kan du använda nedan för att skapa lagrad procedur.

Skapa procedur dbo.sp_GetSaleRecordsPerPage
 @PageNumber int,
 @RowsPerPage int
AS 
BEGIN
Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
         OFFSET (@PageNumber-1)*@RowsPerPage 
         ROWS FETCH NEXT @RowsPerPage ROWS ONLY;
END

Låt oss säga att om vi vill returnera andra sidan med 4 poster kan vi använda dbo.sp_GetSaleRecordsPerPage genom att tillhandahålla nedanstående parametervärden.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Hur man utför paginering i SQL Server med hjälp av OFFSET FETCH-satsen - TSQL-handledning
 




  1. Förvirrad om UPDLOCK, HOLDLOCK

  2. MySQL Trigger för att förhindra INSERT under vissa förhållanden

  3. Utmaningslösningar för nummerseriegenerator – del 2

  4. Snabbt enkelt sätt att migrera SQLite3 till MySQL?