2012-06-11 30 views
6

Tôi đang sử dụng iBatisSQLServer,truy vấn SQL cho lưới asp.net pagination

gì là cách tốt nhất để sử dụng bù đắp và hạn chế cho các truy vấn pagging?

Có thể tôi thêm cột ROW_NUMBER() OVER (ORDER BY Id) AS RowNum, nhưng điều này sẽ chỉ ngăn truy cập dữ liệu cho các truy vấn đơn giản. Có một số trường hợp mà tôi sử dụng công đoàn lựa chọn. Làm thế nào để optmize các truy vấn này?

Trả lời

1

Tôi không biết gì về ibatis, nhưng tôi đoán bạn có thể làm điều này trong SQL.

Nếu tôi hiểu chính xác bạn, bạn muốn phân trang kết quả của câu lệnh chọn hoặc liên kết của một vài câu lệnh chọn.

Tôi sẽ làm theo cách sau. Ví dụ, đây có thể là một thủ tục được lưu trữ và có thể kiểm tra độ chính xác trong đó việc kiểm tra các giá trị bù đắp và giới hạn lớn hơn 0. Nếu bạn thực hiện một việc như thế này, hãy đảm bảo bạn thay thế * bằng cột của mình tên quá!

Dưới đây là một ví dụ với một liên minh:

DECLARE @offset INT; 
DECLARE @limit INT; 

WITH cte 
    AS (SELECT t.*, 
       Row_number() OVER (ORDER BY Id) AS RowNum 
     FROM (SELECT * 
       FROM Table1 
       UNION 
       SELECT * 
       FROM Table2) t) 
SELECT * 
FROM cte 
WHERE RowNum BETWEEN @offset AND @offset + @limit 

Về cơ bản những gì tôi đã làm được lấy một bảng mới từ sự kết hợp của hai truy vấn, như bạn nói có thể xảy ra trong trường hợp của bạn. Sau đó, tôi thêm cột có số hàng vào kết quả của số đó trong một CTE, sau đó chỉ chọn các hàng được chỉ định trong @Offset@limit + @offset để chỉ lấy lại các hàng bạn đã yêu cầu.

Ví dụ: Thiết @offset = 50@limit = 50, bạn sẽ nhận lại kết quả 50-100 (theo lệnh của các tiêu chuẩn quy định tại các Row_number qua khoản.

(Tôi hy vọng đây là loại điều bạn đang tìm kiếm!)

Chỉnh sửa: Điều này sẽ chỉ hoạt động trong SQL Server 2005 trở đi - bạn chưa đề cập phiên bản nào bạn đang sử dụng!

+0

Làm cách nào để nhận tổng số hàng? – Victor

+0

Từ CTE, chọn 'count (*) ', hoặc' Max (RowNum) ... ' – Bridge