2009-11-26 29 views
22

Tôi đang sử dụng một bảng biểu chung cho paging:Làm thế nào tôi có thể tái sử dụng một biểu thức bảng chung

with query as (
    Select Row_Number() over (Order By OrderNum ASC) as TableRowNum, 
     FirstName, 
     LastName 
    From Users 
) 
Select * from query where TableRowNum between 1 and 25 Order By TableRowNum ASC 

Ngay sau khi thực hiện truy vấn này, tôi làm cho thực hiện một truy vấn gần như giống hệt nhau để lấy tổng số mặt hàng :

with query as (
    Select Row_Number() over (Order By OrderNum ASC) as TableRowNum, 
     FirstName, 
     LastName 
    From Users 
) 
Select Count(*) from query 

tôi đã cố gắng kết hợp này lại với nhau (ví dụ: xác định CTE, truy vấn dữ liệu và sau đó truy vấn Count, nhưng khi tôi làm điều này, tôi nhận được một thông báo lỗi "tên đối tượng không hợp lệ 'truy vấn'" trong trả lời truy vấn thứ hai (Số đếm)

Có cách nào để kết hợp hai truy vấn này thành một, để lưu một chuyến đi khứ hồi tới DB không?

Trả lời

33

Nếu bạn không yêu cầu họ trong 2 truy vấn khác nhau, bạn có thể thử

;with query as (
    Select Row_Number() over (Order By UserID ASC) as TableRowNum, 
     FirstName, 
     LastName 
    From Users 
), 
totalCount AS (
    SELECT COUNT(1) Total FROM query 
) 
Select query.*, 
     Total 
from query, totalCount 
where TableRowNum 
between 1 and 25 
Order By TableRowNum ASC 

Nếu bạn yêu cầu 2 truy vấn khác nhau, thay vì sử dụng một bảng var

DECLARE @User TABLE(
     TableRowNum INT, 
     FirstName VARCHAR(50), 
     LastName VARCHAR(50) 
) 
;with query as (
    Select Row_Number() over (Order By UserID ASC) as TableRowNum, 
     FirstName, 
     LastName 
    From Users 
) 
INSERT INTO @User 
SELECT TableRowNum, 
     FirstName, 
     LastName 
FROM query 

SELECT * 
FROM @User 
where TableRowNum 
between 1 and 25 
Order By TableRowNum ASC 

SELECT COUNT(1) FROM @User 
+0

Điểm của việc sử dụng CTE ở đây là gì? –

+2

@Scott Rippey, tôi thấy CTEs sẵn sàng đọc, sử dụng lại và duy trì. –

+0

Oh cảm ơn. Trong khối mã đầu tiên của bạn, bạn sử dụng một CTE để có được tổng số và để có được kết quả, mà làm cho cảm giác hoàn hảo. Nhưng tôi nhận được một lỗi khi tôi cố gắng truy vấn một CTE hai lần. Bạn có thể giải thích lý do tại sao điều này hoạt động? –

2

Bạn có thể làm điều đó như thế này:

with query as (
    Select 
COUNT (*) OVER (PARTITION BY 1) AS TableTotalRows, 
Row_Number() over (Order By OrderNum ASC) as TableRowNum, 
    FirstName, 
    LastName 
    From Users 
) 
+0

nếu bạn thêm 4 dấu cách trước dòng mã, mã được nhận dạng là mã theo ngăn xếp chồng chéo. – Gamlor

+0

Đôi khi chính truy vấn có thể có các hàm tổng hợp trong nó (FirstName, LastName chỉ là một ví dụ đơn giản), vì vậy việc thêm 'Count (*)' làm một cột sẽ không phải là một giải pháp đáng tin cậy. –

2

Theo Microsoft trong số này link:

CTE có thể tự tham chiếu và xác định CTE trước đây trong cùng điều khoản WITH.

Trong đó CTE mới tham khảo trước được xác định CTE, chúng ta có thể thực hiện truy vấn count:

;with query as (
    Select Row_Number() over (Order By UserID ASC) as TableRowNum, 
     FirstName, 
     LastName 
    From Users 
), 
totalCount AS (
    SELECT COUNT(1) Total FROM query 
) 
Select query.*, 
     Total 
from query, totalCount 
where TableRowNum 
between 1 and 25 
Order By TableRowNum ASC 

'truy vấn' là CTE chính và 'TOTALCOUNT' được sử dụng nó cho có được các hàng tổng đếm

Microsoft nên có một ví dụ cho một tác vụ phổ biến như thế này.

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