आपको क्वेरी को दो बार चलाने की आवश्यकता नहीं है।
SELECT ..., total_count = COUNT(*) OVER()
FROM ...
ORDER BY ...
OFFSET 120 ROWS
FETCH NEXT 10 ROWS ONLY;
चैट
पर आधारित , ऐसा लगता है कि आपकी समस्या थोड़ी अधिक जटिल है - आप DISTINCT
. लागू कर रहे हैं पेजिंग के अलावा परिणाम के लिए। इससे यह निर्धारित करना जटिल हो सकता है कि COUNT()
. क्या है जैसा दिखना चाहिए और कहां जाना चाहिए। यहां एक तरीका है (चैट से आपकी अधिक जटिल क्वेरी में तकनीक को शामिल करने की कोशिश करने के बजाय मैं इसे प्रदर्शित करना चाहता हूं):
USE tempdb;
GO
CREATE TABLE dbo.PagingSample(id INT,name SYSNAME);
-- insert 20 rows, 10 x 2 duplicates
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;
SELECT COUNT(*) FROM dbo.PagingSample; -- 20
SELECT COUNT(*) FROM (SELECT DISTINCT id, name FROM dbo.PagingSample) AS x; -- 10
SELECT DISTINCT id, name FROM dbo.PagingSample; -- 10 rows
SELECT DISTINCT id, name, COUNT(*) OVER() -- 20 (DISTINCT is not computed yet)
FROM dbo.PagingSample
ORDER BY id, name
OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY; -- 5 rows
-- this returns 5 rows but shows the pre- and post-distinct counts:
SELECT PostDistinctCount = COUNT(*) OVER() -- 10,
PreDistinctCount -- 20,
id, name
FROM
(
SELECT DISTINCT id, name, PreDistinctCount = COUNT(*) OVER()
FROM dbo.PagingSample
-- INNER JOIN ...
) AS x
ORDER BY id, name
OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY;
साफ़ करें:
DROP TABLE dbo.PagingSample;
GO