এই প্রশ্নের সাথে পেজিং (স্কিপ / টেক) কার্যকারিতা কার্যকর করুন


138

এসকিউএল-এ কাস্টম পেজিং কীভাবে কার্যকর করা যায় সে সম্পর্কে আমি কিছুটা বোঝার চেষ্টা করেছি, উদাহরণস্বরূপ এই জাতীয় নিবন্ধগুলি পড়ার জন্য

আমার নিচের প্রশ্নটি রয়েছে, যা নিখুঁতভাবে কাজ করে। তবে আমি এইটির সাথে পেজিং বাস্তবায়ন করতে চাই।

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

এটা কি আমি চাই

আমার সাথে সম্পর্কিত এন্ট্রি সহ ফোরামের পোস্ট রয়েছে। আমি সর্বশেষে যোগ করা এন্ট্রি সহ পোস্টগুলি পেতে চাই, তাই আমি সম্প্রতি বিতর্কিত পোস্টগুলি নির্বাচন করতে পারি।

এখন, আমি "শীর্ষ 10" এর পরিবর্তে "শীর্ষ 10 থেকে 20 সম্প্রতি সক্রিয় পোস্টগুলি" পেতে সক্ষম হতে চাই।

আমি কি চেষ্টা করেছি

আমি নিবন্ধের মতো ROW ফাংশনগুলি বাস্তবায়নের চেষ্টা করেছি, তবে সত্যিই কোনও ভাগ্য নেই।

কোনও ধারণা কীভাবে এটি বাস্তবায়ন করবেন?

উত্তর:


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

আমরা যদি অর্ডার ছেড়ে যেতে চাই তবে আমরা ব্যবহার করতে পারি

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

(আমি বরং এটি হ্যাক হিসাবে চিহ্নিত করব - তবে এটি এনহাইবারনেট ব্যবহার করেছে OR

প্রশ্নের উত্তর দিতে:

--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(কেবল এসকিউএল স্ট্যান্ডার্ড অনুসরণ করে) চালু করা হয়েছিল।

তবে আমার ধারণা, আপনি এসকিউএল সার্ভার 2012 ব্যবহার করছেন না , তাই না ? পূর্ববর্তী সংস্করণে এটি কিছুটা (সামান্য বিট) কঠিন। এখানে সমস্ত এসকিউএল সার্ভার সংস্করণগুলির তুলনা এবং উদাহরণ রয়েছে: এখানে

সুতরাং, এটি এসকিউএল সার্ভার ২০০৮ এ কাজ করতে পারে :

-- 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

অনেক ধন্যবাদ! এটা সত্যিই ভাল উত্তর! ২০০৮ সালের স্কেল সম্পর্কে কেবল প্রশ্ন। আমি চাই অর্ডারটি যেখানে যাবার আগে ঘটুক, কারণ এটি বর্তমানে সাবসেটটি সাজিয়েছে, তবে আমরা পুরো সেট থেকে কিছু নির্বাচন করতে চাই ... কোনও ধারণা? :) আবারও, ধন্যবাদ
লার্স হোল্ডগার্ড

2
আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি লাস্টডেট অনুসারে বাছাই করতে চান, তাই না? তারপরে আমরা এইভাবে ওভার () ধারাটি পরিবর্তন করতে পারি: ROW_NUMBER () ওভার (অর্ডার বাই ম্যাক্স (ডেটমেড) ডেস্ক )। এবং পোস্টের মাধ্যমে শেষ অর্ডার মুছে ফেলুন । এখন প্রয়োজন হিসাবে সিটিই 'যত তাড়াতাড়ি' বাছাই করা উচিত। সঠিক?
রদিম কাহেলর

1
আপনাকে ধন্যবাদ, এটি সাহায্য করেছে, ২০১২ সালের নমুনা সম্পর্কে একটি নোট, আদেশটি আদেশ বাধ্যতামূলক, আমি ধারা দ্বারা আদেশ ছাড়াই এটি চেষ্টা করছিলাম এবং ত্রুটি পেয়েছি "ভুল বাক্য গঠন" এমএসডিএন সিনট্যাক্সটি না দেখে এবং কীভাবে এই আদেশটি বাধ্যতামূলক তা না শিখলে ভুল কী ছিল তা সম্পর্কে কোনও ধারণা ছিল না ।
এসেন

প্রথম সারিটি 1 বা 0? 0 এবং WHERE RowNumber >= @Start AND RowNumber < @End1000 হলে প্রথম 1000 সারিটি কোথায় পাওয়া উচিত ? @Start@End
সিডব্লিউস্পিয়ার

1
আপনাকে অনেক ধন্যবাদ
মাফী

8

এসকিউএল সার্ভারে এটি করার জন্য, আপনাকে অবশ্যই একটি কলামের মাধ্যমে ক্যোয়ারীটি অর্ডার করতে হবে, যাতে আপনি যে সারিগুলি চান তা নির্দিষ্ট করতে পারেন।

উদাহরণ:

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

এবং এটি করার সময় আপনি "শীর্ষ" কীওয়ার্ডটি ব্যবহার করতে পারবেন না।

আপনি এখানে আরও শিখতে পারেন: https://technet.microsoft.com/pt-br/library/gg699618%28v=sql.110%29.aspx



5

এসকিউএল ২০০৮

রাদিম কাহলারের উত্তর কাজ করে তবে এখানে একটি সংক্ষিপ্ত সংস্করণ রয়েছে:

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 সারি যেখানে পেজিং CustomerId হয় প্রাথমিক কী

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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.