PostgreSQL এ রয়েছে Limit
এবং Offset
কিওয়ার্ড যা ফলাফলের সেট খুব সহজ পত্রাঙ্কন অনুমতি দেবে।
এসকিউএল সার্ভারের সমতুল্য বাক্য গঠন কী?
PostgreSQL এ রয়েছে Limit
এবং Offset
কিওয়ার্ড যা ফলাফলের সেট খুব সহজ পত্রাঙ্কন অনুমতি দেবে।
এসকিউএল সার্ভারের সমতুল্য বাক্য গঠন কী?
উত্তর:
সমতুল্য LIMIT
হয় SET ROWCOUNT
, কিন্তু আপনি যদি জেনেরিক পত্রাঙ্কন চান এটা ভালো একটি ক্যোয়ারী লিখুন ভালো:
;WITH Results_CTE AS
(
SELECT
Col1, Col2, ...,
ROW_NUMBER() OVER (ORDER BY SortCol1, SortCol2, ...) AS RowNum
FROM Table
WHERE <whatever>
)
SELECT *
FROM Results_CTE
WHERE RowNum >= @Offset
AND RowNum < @Offset + @Limit
এখানে সুবিধাটি হ'ল অফসেটের পরামিতি এবং সীমাবদ্ধতার পরামিতি হ'ল আপনি যদি নিজের পেজিং বিকল্পগুলি পরিবর্তন করার সিদ্ধান্ত নেন (বা ব্যবহারকারীকে এটি করার অনুমতি দিন)।
নোট:@Offset
পরামিতি স্বাভাবিক শূন্য ভিত্তিক ইন্ডেক্স চেয়ে বরং এক-ভিত্তিক ইন্ডেক্স ব্যবহার করা উচিত।
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
। এমএসএসকিউএল ২০০৮ আর 2।
Table
200k রেকর্ড থাকে তবে এটি প্রথমে সমস্তটি নিয়ে আসে, তারপরে সীমাটি প্রয়োগ করবেন? এই কোয়েরি দক্ষ?
এই বৈশিষ্ট্যটি এখন এসকিউএল সার্ভার ২০১২-তে সহজ করা হয়েছে S এটি এসকিউএল সার্ভার ২০১২ থেকে কাজ করছে।
এসকিউএল সার্ভারে 11 থেকে 20 টি সারি নির্বাচন করতে অফসেট সহ সীমাবদ্ধ করুন:
SELECT email FROM emailTable
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
OFFSET
: এড়িয়ে যাওয়া সারিগুলির সংখ্যাNEXT
: পরবর্তী সারির প্রয়োজনীয় সংখ্যাSQL_CALC_FOUND_ROWS
ব্যবহার করার সময় কি কোনও সমতুল্য থাকে ?
select top {LIMIT HERE} * from (
select *, ROW_NUMBER() over (order by {ORDER FIELD}) as r_n_n
from {YOUR TABLES} where {OTHER OPTIONAL FILTERS}
) xx where r_n_n >={OFFSET HERE}
একটি দ্রষ্টব্য:
এই সমাধানটি কেবল এসকিউএল সার্ভার ২০০৫ বা তারপরেই কাজ করবে, যেহেতু ROW_NUMBER()
এটি কার্যকর হয়েছিল তখন ।
AS xx
এটি অর্জনের জন্য আপনি একটি সাধারণ টেবিল এক্সপ্রেশনটিতে ROW_NUMBER ব্যবহার করতে পারেন।
;WITH My_CTE AS
(
SELECT
col1,
col2,
ROW_NUMBER() OVER(ORDER BY col1) AS row_number
FROM
My_Table
WHERE
<<<whatever>>>
)
SELECT
col1,
col2
FROM
My_CTE
WHERE
row_number BETWEEN @start_row AND @end_row
আমার জন্য অফসেট এবং ফিটের একসাথে ব্যবহার ধীর ছিল, তাই আমি এই জাতীয় শীর্ষ এবং অফসেটের সংমিশ্রণটি ব্যবহার করেছি (যা দ্রুত ছিল):
SELECT TOP 20 * FROM (SELECT columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
দ্রষ্টব্য: আপনি যদি একই ওপরে টপ এবং অফসেট একসাথে ব্যবহার করেন তবে:
SELECT TOP 20 columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS
তারপরে আপনি একটি ত্রুটি পান, সুতরাং শীর্ষ এবং অফসফট একসাথে ব্যবহারের জন্য আপনাকে এটিকে একটি সাব-কোয়েরির সাথে পৃথক করতে হবে।
এবং যদি আপনার SELECT DISTINCT ব্যবহার করতে হয় তবে ক্যোয়ারীটি এমন:
SELECT TOP 20 FROM (SELECT DISTINCT columname1, columname2
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
দ্রষ্টব্য: DISTINCT সহ SELECT ROW_NUMBER এর ব্যবহার আমার পক্ষে কার্যকর হয়নি।
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
আপনাকে অবশ্যই এটির মতো রূপান্তর করতে হবে SELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
। আমি আমার উত্তর সম্পাদনা করব। ধন্যবাদ এবং আমাকে আমার ইংরেজি ক্ষমা করুন।
আরেকটি নমুনা:
declare @limit int
declare @offset int
set @offset = 2;
set @limit = 20;
declare @count int
declare @idxini int
declare @idxfim int
select @idxfim = @offset * @limit
select @idxini = @idxfim - (@limit-1);
WITH paging AS
(
SELECT
ROW_NUMBER() OVER (order by object_id) AS rowid, *
FROM
sys.objects
)
select *
from
(select COUNT(1) as rowqtd from paging) qtd,
paging
where
rowid between @idxini and @idxfim
order by
rowid;
নেই এখানে SQL 2011 সালে এই বৈশিষ্ট্যটি, তার দু: খিত তারা একটু ভিন্ন শব্দ চয়ন "OFFSET / আনা" কিন্তু তার, standart তারপর ঠিক নয় সম্পর্কে কেউ বলার।
অ্যারোনআউট এর সমাধানটিতে সামান্যতম প্রকরণ যুক্ত করে আমি সাধারণত পৃষ্ঠা নম্বর (@ পেজনাম) এবং পৃষ্ঠার আকার (@ পেজসাইজ) প্যারাম্যাট্রাইজ করি। প্রতিটি পৃষ্ঠার ক্লিক ইভেন্টটি একটি কনফিগারযোগ্য পৃষ্ঠা আকারের সাথে অনুরোধ করা পৃষ্ঠা নম্বরটিতে কেবল প্রেরণ করে:
begin
with My_CTE as
(
SELECT col1,
ROW_NUMBER() OVER(ORDER BY col1) AS row_number
FROM
My_Table
WHERE
<<<whatever>>>
)
select * from My_CTE
WHERE RowNum BETWEEN (@PageNum - 1) * (@PageSize + 1)
AND @PageNum * @PageSize
end
সবচেয়ে কাছেরটা আমি করতে পারি
select * FROM( SELECT *, ROW_NUMBER() over (ORDER BY ID ) as ct from [db].[dbo].[table] ) sub where ct > fromNumber and ct <= toNumber
যা আমি অনুরূপ অনুমান select * from [db].[dbo].[table] LIMIT 0, 10
@nombre_row :nombre ligne par page
@page:numero de la page
//--------------code sql---------------
declare @page int,@nombre_row int;
set @page='2';
set @nombre_row=5;
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY etudiant_ID ) AS RowNum, *
FROM etudiant
) AS RowConstrainedResult
WHERE RowNum >= ((@page-1)*@nombre_row)+1
AND RowNum < ((@page)*@nombre_row)+1
ORDER BY RowNum
যেহেতু কেউ এখনও এই কোডটি সরবরাহ করেনি:
SELECT TOP @limit f1, f2, f3...
FROM t1
WHERE c1 = v1, c2 > v2...
AND
t1.id NOT IN
(SELECT TOP @offset id
FROM t1
WHERE c1 = v1, c2 > v2...
ORDER BY o1, o2...)
ORDER BY o1, o2...
গুরুত্বপূর্ণ বিষয়:
@limit
পুনরুদ্ধার করার জন্য ফলাফলের সংখ্যা সহ প্রতিস্থাপন করা যেতে পারে,@offset
এড়িয়ে যাওয়ার ফলাফলের সংখ্যাwhere
এবং order by
ধারাগুলি সদৃশ করে এবং যদি সিঙ্কের বাইরে থাকে তবে ভুল ফলাফল প্রদান করবেorder by
স্পষ্টভাবে আছে যদি এটির প্রয়োজন হয়বিশেষত এসকিউএল-সার্ভারের জন্য আপনি এটি বিভিন্ন উপায়ে অর্জন করতে পারেন given প্রকৃত উদাহরণ হিসাবে আমরা গ্রাহক টেবিলটি এখানে নিয়েছি।
উদাহরণ 1: "সেট ROWCOUNT" সহ
SET ROWCOUNT 10
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
সমস্ত সারি ফিরিয়ে আনার জন্য ROWCOUNT টি 0 তে সেট করুন
SET ROWCOUNT 0
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
উদাহরণ 2: "ROW_NUMBER এবং ওভার" সহ
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber Between 0 and 10
উদাহরণ 3: "অফসেট এবং ফিচার" সহ, তবে এই "অর্ডার বাই" দিয়ে বাধ্যতামূলক
SELECT CustomerID, CompanyName FROM Customers
ORDER BY CompanyName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
আশা করি এটি আপনাকে সহায়তা করবে।
যেহেতু, আমি এই স্ক্রিপ্টটি আরও বার বার পরীক্ষা করে দেখি 1 মিলিয়ন রেকর্ড প্রতিটি পৃষ্ঠার 100 পৃষ্ঠা রেকর্ডিং কাজ করে দ্রুত আমার পিসি এই স্ক্রিপ্ট 0 সেকেন্ড চালায় তবে মাইএসকিএল এর সাথে তুলনা করার নিজস্ব সীমা থাকে এবং ফলাফলটি পেতে প্রায় 4.5 সেকেন্ড অফসেট করে।
কেউ Row_Number () বোঝার জন্য সর্বদা নির্দিষ্ট ক্ষেত্র অনুসারে বাছাই করতে পারে। সিক্যুয়ালে কেবলমাত্র সারিটি সংজ্ঞায়িত করার প্রয়োজন থাকলে ব্যবহার করা উচিত:
SELECT TOP {LIMIT} * FROM (
SELECT TOP {LIMIT} + {OFFSET} ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ROW_NO,*
FROM {TABLE_NAME}
) XX WHERE ROW_NO > {OFFSET}
ব্যাখ্যা করা: