2011-09-15 21 views
10

Tôi cố gắng để trở lại một trang dữ liệu và cũng chèo đếm của tất cả các dữ liệu trong một thủ tục lưu trữ mà trông giống như sau:CTE, ROW_NUMBER và ROWCOUNT

WITH Props AS 
(
    SELECT *, 
    ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber 
    FROM Property 
    WHERE PropertyType = @PropertyType AND ... 
) 

SELECT * FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize); 

Tôi không thể trả lại số hàng (số hàng cao nhất).

Tôi biết điều này đã được thảo luận (Tôi đã nhìn thấy điều này: Efficient way of getting @@rowcount from a query using row_number) nhưng khi tôi thêm COUNT (x) OVER (PARTITION BY 1) trong việc thực hiện phân hủy CTE và các truy vấn trên mà thường mất không mất thời gian để thực thi. Tôi nghĩ đó là vì số lượng được tính cho mỗi hàng? Có vẻ như tôi không thể tái sử dụng CTE trong một truy vấn khác. Bảng đạo cụ có 100k hồ sơ, CTE trả về 5k hồ sơ.

+1

nên gắn lại thẻ như một câu hỏi SQL Server. Tôi đã làm điều đó cho bạn, nhưng bạn chỉ được phép 5 thẻ, và tôi không biết bạn muốn loại bỏ cái gì. –

Trả lời

15

Trong T-SQL nó phải được

;WITH Props AS 
(
    SELECT *, 
     ROW_NUMBER() OVER (ORDER BY PropertyID) AS RowNumber 
    FROM Property 
    WHERE PropertyType = @PropertyType AND ... 
) 

, Props2 AS 
(
    SELECT COUNT(*) CNT FROM Props 
) 

-- Now you can use even Props2.CNT 
SELECT * FROM Props, Props2 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 AND (@PageNumber * @PageSize); 

bây giờ bạn có CNT trong mỗi dòng ... Hoặc bạn muốn một cái gì đó khác nhau? Bạn muốn có một resultset thứ hai chỉ với số lượng? Sau đó làm điều đó!

-- This could be the second result-set of your query. 
SELECT COUNT(*) CNT 
FROM Property 
WHERE PropertyType = @PropertyType AND ... 

Lưu ý: reedited, truy vấn 1 David đã được tham khảo bây giờ đã được trashcanned, truy vấn 2 tại là truy vấn 1.

+0

1. không hoạt động vì bạn phải có một nhóm theo mệnh đề. 2. hoạt động hoàn hảo và tôi thích nó nhất. Cảm ơn bạn. – David

+0

Trong phiên bản của tôi, tôi đã có COUNT (1) được thêm vào trong cte đầu tiên gây 800.000 lần đọc trên bàn làm việc. Sử dụng một cte thứ hai (như bạn đã làm ở đây) bỏ qua tất cả những lần đọc dẫn đến một truy vấn nhanh chóng. –

1

Bạn muốn đếm cho toàn bộ kết quả phải không?

tính năng này có hoạt động nhanh không?

SELECT *,(select MAX(RowNumber) from Props) as MaxRow 
FROM Props 
WHERE RowNumber BETWEEN ((@PageNumber - 1) * @PageSize) + 1 
    AND (@PageNumber * @PageSize); 
+0

thêm cca 10% tuyến tính thật tuyệt vời! bây giờ sẽ thử câu trả lời khác được nêu ra .. – David

Các vấn đề liên quan