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।
Table200k রেকর্ড থাকে তবে এটি প্রথমে সমস্তটি নিয়ে আসে, তারপরে সীমাটি প্রয়োগ করবেন? এই কোয়েরি দক্ষ?
এই বৈশিষ্ট্যটি এখন এসকিউএল সার্ভার ২০১২-তে সহজ করা হয়েছে 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}
ব্যাখ্যা করা: