Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Lọc theo Tùy chọn OFFSET-FETCH trong Truy vấn chọn - Hướng dẫn SQL Server / TSQL Phần 118

Tình huống:

Bạn đang làm việc với tư cách là nhà phát triển SQL Server với nhóm phát triển giao diện người dùng. Nhóm giao diện người dùng cần triển khai phân trang. Bạn nhầm lẫn về Pagination? Không vấn đề gì. Hãy suy nghĩ về việc xem bảng sao kê ngân hàng hoặc bảng sao kê thẻ tín dụng của bạn. Trong đó các ứng dụng chỉ hiển thị 10 hoặc 20 bản ghi trên mỗi trang và bạn phải nhấp vào tiếp theo để xem các bản ghi tiếp theo. Điều đó được gọi là phân trang.

Bây giờ bạn đã hiểu về phân trang, phát triển giao diện người dùng cần truy vấn SQL từ bạn. được sử dụng để trả về các kết quả cần thiết và chúng phải có thể vượt qua số trang để trả về các bản ghi.


Giải pháp:

Có nhiều cách để viết truy vấn Pagination, Một trong số đó là sử dụng mệnh đề OFFSET FETCH. Bạn phải sắp xếp các bản ghi nếu bạn muốn sử dụng OFFSET FETCH.

Hãy tạo bảng dbo.TotalSale và chèn một số bản ghi mẫu. Tôi chỉ mới chèn 11 bản ghi.

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) Giả sử nếu chúng ta muốn bỏ qua 5 hàng đầu tiên và muốn hiển thị tất cả các hàng còn lại mà chúng ta có thể sử dụng truy vấn bên dưới.

Select 
[id], [SalePersonFName], [SalePersonLName], [ProductName],
[ItemsSold], [SoldPrice]
 from dbo.TotalSale 
          order by id
          OFFSET 5 rows
Cách sử dụng Mệnh đề OFFSET FETCH trong SQL Server để bỏ qua X hàng đầu tiên và hiển thị tất cả các hàng còn lại - Hướng dẫn SQL Server

2) Bây giờ nếu chúng ta muốn hiển thị 3 bản ghi trên mỗi trang, chúng ta có thể sử dụng truy vấn dưới đây. Trong trường hợp này, chúng tôi sẽ hiển thị trang đầu tiên

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

Cách sử dụng mệnh đề OFFSET FETCH để trả về bản ghi trên mỗi trang trong SQL Server - Hướng dẫn sử dụng SQL Server

Nhận thấy rằng tôi có OFFSET 0, điều đó có nghĩa là tôi muốn hiển thị trang đầu tiên và có 3 hàng. Nếu tôi muốn hiển thị các bản ghi trang thứ hai, tôi sẽ đặt thành OFFSET 1, phần CHỈ 3 ROWS Tiếp theo sẽ giữ nguyên như muốn chỉ hiển thị 3 hàng trên mỗi trang.

Chúng ta có thể sử dụng các biến để chúng ta không phải thực hiện thay đổi trong truy vấn và bằng cách thay đổi giá trị của các biến, chúng tôi có thể trả về kết quả cần thiết của mình. Bạn có thể tạo Thủ tục được lưu trữ nếu muốn bằng cách sử dụng truy vấn dưới đây.

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;
 
Nếu chúng tôi cần cung cấp Thủ tục đã lưu trữ cho nhóm Front End, nhóm này chấp nhận số trang và số hàng mà họ muốn trả lại cho mỗi trang, bạn có thể sử dụng bên dưới để tạo Thủ tục đã lưu trữ.

Tạo quy trình 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

Giả sử nếu chúng ta muốn trả lại trang thứ hai với 4 bản ghi, chúng ta có thể sử dụng dbo.sp_GetSaleRecordsPerPage bằng cách cung cấp các giá trị tham số bên dưới.

EXEC dbo.sp_GetSaleRecordsPerPage 2,4
Cách thực hiện Phân trang trong SQL Server bằng cách sử dụng mệnh đề OFFSET FETCH - Hướng dẫn 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. SQL Server và các lỗ hổng Spectre / Meltdown

  2. Khi xóa tầng cho bảng tự tham chiếu

  3. Trả lại tất cả các nhóm tệp cho cơ sở dữ liệu hiện tại trong SQL Server

  4. SQL giữa không bao gồm

  5. Chuyển đổi số nguyên thành hex và hex thành số nguyên