खोज…


परिचय

SQL सर्वर के विभिन्न संस्करणों में रो ऑफसेट और पेजिंग

वाक्य - विन्यास

  • का चयन करें * से तालिका नाम से पता चलता है, केवल 10 पंक्तियों के बाद से केवल 10 पंक्तियाँ;

एक सामान्य टेबल एक्सप्रेशन के साथ ROW_NUMBER का उपयोग करके पृष्ठांकन

SQL सर्वर 2008

ROW_NUMBER फ़ंक्शन परिणाम सेट में प्रत्येक पंक्ति को एक वृद्धि संख्या निर्दिष्ट कर सकता है। एक कॉमन टेबल एक्सप्रेशन के साथ संयुक्त है जो एक BETWEEN ऑपरेटर का उपयोग करता है, परिणाम सेट के 'पेज' बनाना संभव है। उदाहरण के लिए: पृष्ठ एक वाले परिणाम 1-10, पृष्ठ दो वाले परिणाम 11-20, पृष्ठ तीन वाले परिणाम 21-30, और इसी तरह।

WITH data
AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY name) AS row_id,
        object_id,
        name, 
        type,
        create_date
    FROM sys.objects
)
SELECT *
FROM data
WHERE row_id BETWEEN 41 AND 50

नोट: ROW_NUMBER का उपयोग WHERE क्लॉज में करना संभव नहीं है जैसे:

SELECT object_id,
    name,
    type,
    create_date
FROM sys.objects
WHERE ROW_NUMBER() OVER (ORDER BY name) BETWEEN 41 AND 50

यद्यपि यह अधिक सुविधाजनक होगा, SQL सर्वर इस मामले में निम्नलिखित त्रुटि लौटाएगा:

Msg 4108, स्तर 15, राज्य 1, पंक्ति 6

विंडो किए गए फ़ंक्शन केवल SELECT या ORDER BY क्लॉस में दिखाई दे सकते हैं।

OFFSET FETCH के साथ अंकुरण

SQL सर्वर 2012

OFFSET FETCH क्लॉज अधिक संक्षिप्त तरीके से पृष्ठांकन को लागू करता है। इसके साथ, N1 पंक्तियों ( OFFSET में निर्दिष्ट) को छोड़ना और अगली N2 पंक्तियों को वापस करना संभव है ( FETCH में निर्दिष्ट):

SELECT *
FROM sys.objects
ORDER BY object_id
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY

नियतात्मक परिणाम प्रदान करने के लिए ORDER BY की आवश्यकता है।

पगिनटन आंतरिक प्रश्न के साथ

SQL सर्वर के पुराने संस्करणों में, डेवलपर्स को पृष्ठ में पंक्तियों को वापस करने के लिए TOP कीवर्ड के साथ संयुक्त डबल सॉर्टिंग का उपयोग करना था:

 SELECT TOP 10 *
 FROM
 (
    SELECT
    TOP 50 object_id,
        name,
        type,
        create_date
    FROM sys.objects
    ORDER BY name ASC
) AS data
ORDER BY name DESC

आंतरिक क्वेरी name द्वारा आदेशित पहली 50 पंक्तियों को वापस कर देगी। फिर बाहरी क्वेरी इन 50 पंक्तियों के क्रम को उलट देगी और शीर्ष 10 पंक्तियों का चयन करेगी (ये उलटफेर से पहले समूह में अंतिम 10 पंक्तियाँ होंगी)।

SQL सर्वर के विभिन्न संस्करणों में पेजिंग

SQL सर्वर 2012/2014


DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM OrderDetail
ORDER BY OrderId
OFFSET (@PageNumber - 1) * @RowsPerPage ROWS
FETCH NEXT @RowsPerPage ROWS ONLY

SQL सर्वर 2005/2008 / R2


DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (
    SELECT OrderId, ProductId, ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
    FROM OrderDetail) AS OD
WHERE OD.RowNum BETWEEN ((@PageNumber - 1 ) * @RowsPerPage) + 1
AND @RowsPerPage * @PageNumber

SQL सर्वर 2000


DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (SELECT TOP (@RowsPerPage) OrderId, ProductId
        FROM (SELECT TOP ((@PageNumber)*@RowsPerPage) OrderId, ProductId
                FROM OrderDetail
                ORDER BY OrderId) AS OD
    ORDER BY OrderId DESC) AS OD2
ORDER BY OrderId ASC

SQL सर्वर 2012/2014 OFFSET और FETCH नेक्स्ट का उपयोग कर

अगली 10 पंक्तियाँ प्राप्त करने के लिए बस इस क्वेरी को चलाएं:

SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

इसका उपयोग करते समय विचार करने के लिए मुख्य बिंदु:

  • ORDER BY OFFSET और FETCH क्लॉज का उपयोग करना अनिवार्य है।
  • OFFSET क्लॉज FETCH साथ अनिवार्य है। आप कभी भी, ORDER BY ... FETCH उपयोग नहीं कर सकते।
  • TOP को उसी क्वेरी एक्सप्रेशन में OFFSET और FETCH के साथ नहीं जोड़ा जा सकता है।


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow