Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Filtrowanie według opcji OFFSET-FETCH w zapytaniu Select — samouczek SQL Server / TSQL, część 118

Scenariusz:

Pracujesz jako programista SQL Server z zespołem programistów front-end.Zespół front-end musi zaimplementować paginację. Nie rozumiesz paginacji? Nie ma problemu. Pomyśl o przejrzeniu wyciągu bankowego lub wyciągu z karty kredytowej. Aplikacje wyświetlają tylko 10 lub 20 rekordów na stronie i musisz kliknąć przycisk Dalej, aby zobaczyć następne rekordy. Nazywa się to paginacją.

Teraz rozumiesz paginację, programowanie front-end wymaga zapytania SQL, które może być używane do zwracania wymaganych wyników i powinny być w stanie przekazać numer strony w celu zwrócenia rekordów.


Rozwiązanie:

Istnieje wiele sposobów pisania zapytań o paginację, jednym z nich jest użycie klauzuli OFFSET FETCH. Musisz posortować rekordy, jeśli chcesz użyć OFFSET FETCH.

Stwórzmy tabelę dbo.TotalSale i wstawmy kilka przykładowych rekordów. Wstawiłem tylko 11 rekordów.

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) Załóżmy, że chcemy pominąć pierwsze 5 wierszy i wyświetlić wszystkie pozostałe wiersze, których możemy użyć w zapytaniu.

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
          OFFSET 5 rows
Jak używać klauzuli OFFSET FETCH w SQL Server, aby pominąć pierwsze X wierszy i wyświetlić wszystkie pozostałe — samouczek SQL Server

2) Teraz, jeśli chcielibyśmy pokazać 3 rekordy na stronie, możemy użyć poniższego zapytania. W tym przypadku pokażemy pierwszą stronę

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

Jak używać klauzuli OFFSET FETCH do zwracania rekordów na stronę w SQL Server — samouczek SQL Server

Zauważyłem, że mam PRZESUNIĘCIE 0, co oznacza, że ​​chcę pokazać pierwszą stronę z 3 wierszami. Jeśli chcę pokazać rekordy drugiej strony, ustawię na PRZESUNIĘCIE 1, część TYLKO NASTĘPNE 3 WIERSZE pozostanie taka sama, jak chcę pokazać tylko 3 wiersze na stronę.

Możemy użyć zmiennych, więc możemy nie musimy wprowadzać zmian w zapytaniu, a zmieniając wartości zmiennych, możemy zwrócić wymagane przez nas wyniki. Możesz utworzyć procedurę składowaną, jeśli chcesz, korzystając z poniższego zapytania.

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;
 
Jeśli musimy udostępnić procedurę składowaną zespołowi Front End, który akceptuje numer strony i liczbę wierszy, które chcieliby zwrócić dla każdej strony, możesz użyć poniższej procedury, aby utworzyć procedurę składowaną.

Utwórz 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

Powiedzmy, że jeśli chcemy zwrócić drugą stronę z 4 rekordami, możemy użyć dbo.sp_GetSaleRecordsPerPage podając poniższe wartości parametrów.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Jak wykonać stronicowanie w SQL Server przy użyciu klauzuli OFFSET FETCH — samouczek TSQL
 




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wykonać IF...THEN w SQL SELECT?

  2. Jak wygenerować skrypty upuszczania unikalnych ograniczeń w bazie danych SQL Server — samouczek SQL Server / TSQL część 99

  3. Zaktualizuj profil poczty bazy danych w programie SQL Server (T-SQL)

  4. 10 najczęściej zadawanych pytań dotyczących monitorowania wydajności serwera SQL

  5. datetime vs datetime2 w SQL Server:jaka jest różnica?