इस क्वेरी के साथ पेजिंग (स्किप / टेक) कार्यक्षमता को लागू करें


138

मैं थोड़ा समझने की कोशिश कर रहा हूं कि SQL में कस्टम पेजिंग को कैसे लागू किया जाए, उदाहरण के लिए इस तरह के लेखों को पढ़ना ।

मेरे पास निम्नलिखित क्वेरी है, जो पूरी तरह से काम करती है। लेकिन मैं इसके साथ पेजिंग को लागू करना चाहूंगा।

SELECT TOP x PostId FROM ( SELECT PostId, MAX (Datemade) as LastDate
 from dbForumEntry 
 group by PostId ) SubQueryAlias
 order by LastDate desc

मुझे क्या चाहिए

मेरे पास फ़ोरम पोस्ट हैं, संबंधित प्रविष्टियों के साथ। मैं नवीनतम जोड़ा प्रविष्टियों के साथ पदों को प्राप्त करना चाहता हूं, इसलिए मैं हाल ही में बहस किए गए पदों का चयन कर सकता हूं।

अब, मैं "शीर्ष 10" के बजाय "शीर्ष 10 से 20 हाल ही में सक्रिय पोस्ट" प्राप्त करने में सक्षम होना चाहता हूं।

मैंने क्या कोशिश की है

मैंने लेख में एक के रूप में आरओडब्ल्यू कार्यों को लागू करने की कोशिश की है, लेकिन वास्तव में कोई भाग्य नहीं है।

किसी भी विचार यह कैसे लागू करने के लिए?

जवाबों:


288

में SQL सर्वर 2012 यह बहुत आसान बहुत है

SELECT col1, col2, ...
 FROM ...
 WHERE ... 
 ORDER BY -- this is a MUST there must be ORDER BY statement
-- the paging comes here
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

अगर हम ORDER BY को छोड़ना चाहते हैं तो हम उपयोग कर सकते हैं

SELECT col1, col2, ...
  ...
 ORDER BY CURRENT_TIMESTAMP
OFFSET     10 ROWS       -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

(मैं नहीं चाहता कि एक हैक के रूप में चिह्नित करें - लेकिन इसका उपयोग किया जाता है, उदाहरण के लिए NHibernate द्वारा। ORDER BY के रूप में एक बुद्धिमानी से उठाया कॉलम का उपयोग करने के लिए पसंदीदा तरीका है)

प्रश्न का उत्तर देने के लिए:

--SQL SERVER 2012
SELECT PostId FROM 
        ( SELECT PostId, MAX (Datemade) as LastDate
            from dbForumEntry 
            group by PostId 
        ) SubQueryAlias
 order by LastDate desc
OFFSET 10 ROWS -- skip 10 rows
FETCH NEXT 10 ROWS ONLY; -- take 10 rows

नए प्रमुख शब्द offsetऔर fetch next(एसक्यूएल मानकों का पालन करते हुए) पेश किए गए थे।

लेकिन मुझे लगता है, कि आप SQL Server 2012 का उपयोग नहीं कर रहे हैं , है ना? पिछले संस्करण में यह थोड़ा (थोड़ा) मुश्किल है। यहां सभी SQL सर्वर संस्करणों के लिए तुलना और उदाहरण दिए गए हैं: यहां

तो, यह SQL Server 2008 में काम कर सकता है :

-- SQL SERVER 2008
DECLARE @Start INT
DECLARE @End INT
SELECT @Start = 10,@End = 20;


;WITH PostCTE AS 
 ( SELECT PostId, MAX (Datemade) as LastDate
   ,ROW_NUMBER() OVER (ORDER BY PostId) AS RowNumber
   from dbForumEntry 
   group by PostId 
 )
SELECT PostId, LastDate
FROM PostCTE
WHERE RowNumber > @Start AND RowNumber <= @End
ORDER BY PostId

आपका बहुत बहुत धन्यवाद! यह एक बहुत अच्छा जवाब है! केवल sql 2008 के बारे में प्रश्न। मैं चाहता हूं कि आदेश कहां से पहले हो, क्योंकि यह वर्तमान में सबसेट को छांटेगा, लेकिन हम पूरे सेट से कुछ का चयन करना चाहते हैं ... कोई विचार? :) एक बार फिर, धन्यवाद
लार्स होल्डगार्ड

2
अगर मैं आपको सही ढंग से समझाता हूं, तो आप LastDate द्वारा, सही करना चाहेंगे? फिर हम इस तरह OVER () क्लॉज को बदल सकते हैं: ROW_NUMBER () OVER (ORDER BY MAX (डेटमेड) डेस )। और PostId द्वारा अंतिम आदेश निकालें । अब सीटीई को आवश्यकतानुसार er जल्द ’छांटना चाहिए। सही बात?
रेडिम कोहलर 20

1
धन्यवाद, इसने मदद की, 2012 के नमूने के बारे में एक नोट, ऑर्डर अनिवार्य है, मैं बिना किसी आदेश के यह कोशिश कर रहा था और त्रुटि मिली "गलत वाक्यविन्यास" को पता नहीं था कि क्या गलत था जब तक मैं एमएसडीएन सिंटैक्स में देखता हूं और सीखा कि ऑर्डर अनिवार्य है ।
Esen

पहली पंक्ति 1 या 0 है? WHERE RowNumber >= @Start AND RowNumber < @Endअगर @Start0 है और @End1000 है तो पहली 1000 पंक्तियाँ कहाँ होनी चाहिए ?
CWSpear

1
बहुत बहुत धन्यवाद
Mafii

8

SQL सर्वर में ऐसा करने के लिए, आपको एक कॉलम द्वारा क्वेरी का आदेश देना होगा, ताकि आप अपनी इच्छित पंक्तियों को निर्दिष्ट कर सकें।

उदाहरण:

select * from table order by [some_column] 
offset 10 rows
FETCH NEXT 10 rows only

और ऐसा करते समय आप "TOP" कीवर्ड का उपयोग नहीं कर सकते।

आप यहाँ और अधिक जान सकते हैं: https://technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx



5

SQL 2008

रेडिम कोहलर का जवाब काम करता है, लेकिन यहां एक छोटा संस्करण है:

select top 20 * from
(
select *,
ROW_NUMBER() OVER (ORDER BY columnid) AS ROW_NUM
from tablename
) x
where ROW_NUM>10

स्रोत: https://forums.asp.net/post/4033909.aspx


-1

आप पेजेशन के लिए नेस्टेड क्वेरी को निम्नानुसार उपयोग कर सकते हैं :

4 पंक्ति से 8 पंक्ति जहां के लिए पेजिंग ग्राहक आईडी है प्राथमिक कुंजी

SELECT Top 5 * FROM Customers
WHERE Country='Germany' AND CustomerId Not in (SELECT Top 3 CustomerID FROM Customers
WHERE Country='Germany' order by city) 
order by city;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.