আমার এই প্রশ্নটি মাইএসকিউএল সহ রয়েছে:
select * from table1 LIMIT 10,20
আমি কীভাবে এসকিউএল সার্ভার দিয়ে এটি করতে পারি?
আমার এই প্রশ্নটি মাইএসকিউএল সহ রয়েছে:
select * from table1 LIMIT 10,20
আমি কীভাবে এসকিউএল সার্ভার দিয়ে এটি করতে পারি?
উত্তর:
এসকিউএল সার্ভার 2005 শুরু করে, আপনি এটি করতে পারেন ...
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 10 AND 20;
বা 2000 এবং নীচের সংস্করণগুলির জন্য এর মতো কিছু ...
SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC
আড়ষ্ট, তবে কাজ করবে।
SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id
এমএমএসকিউএল-র একটি সীমাবদ্ধ ধারা বাদ দেওয়া আইএমও অপরাধী। আপনার এই ধরণের ক্লডজি ওয়ার্কআরাউন্ড করা উচিত নয়।
এসকিউএল সার্ভার ২০১২ দিয়ে শুরু করে আপনি অফসটি ফেচ ক্লজটি ব্যবহার করতে পারেন:
USE AdventureWorks;
GO
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader
ORDER BY SalesOrderID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
GO
http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx
অর্ডারটি অনন্য না হলে এটি সঠিকভাবে কাজ করতে পারে না।
যদি ক্যোয়ারী অর্ডার তারিখে অর্ডারতে পরিবর্তন করা হয়, প্রত্যাশিত ফলাফল সেট প্রত্যাশিত হয় না।
এটি আমি অক্টোবরে জিজ্ঞাসা করা একটি প্রশ্নের প্রায় সদৃশ: মাইক্রোসফ্ট এসকিউএল সার্ভার 2000 এ মাইএসকিউএল লিমিটেড অনুচ্ছেদটি অনুকরণ করুন
আপনি যদি মাইক্রোসফ্ট এসকিউএল সার্ভার 2000 ব্যবহার করেন তবে এর থেকে ভাল কোনও সমাধান নেই। বেশিরভাগ লোককে IDENTITY
প্রাথমিক কী সহ অস্থায়ী টেবিলে ক্যোয়ারির ফলাফল ক্যাপচার করতে হবে । তারপরে একটি BETWEEN
শর্ত ব্যবহার করে প্রাথমিক কী কলামের বিরুদ্ধে জিজ্ঞাসা করুন ।
আপনি যদি মাইক্রোসফ্ট এসকিউএল সার্ভার 2005 বা তার পরে ব্যবহার করেন তবে আপনার একটি ROW_NUMBER()
ফাংশন রয়েছে, যাতে আপনি একই ফলাফল পেতে পারেন তবে অস্থায়ী টেবিলটি এড়িয়ে যেতে পারেন।
SELECT t1.*
FROM (
SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @offset+@count;
@ লিওন টায়সনের উত্তরে দেখানো হিসাবে আপনি এটি সাধারণ টেবিল এক্সপ্রেশন হিসাবেও লিখতে পারেন ।
এমএস এসকিউএল সার্ভার ২০১২-এ আমি এইভাবে ফলাফলগুলি সীমাবদ্ধ করলাম:
SELECT *
FROM table1
ORDER BY columnName
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
দ্রষ্টব্য: OFFSET
কেবলমাত্র সাথেই বা এর সাথে ব্যবহার করা যেতে পারে ORDER BY
।
কোড লাইনটি ব্যাখ্যা করার জন্য OFFSET xx ROWS FETCH NEXT yy ROW ONLY
xx
রেকর্ড / সারি আপনি যে নম্বরে টেবিল অর্থাত থেকে টেনে শুরু করতে চান: যদি সেখানে সারণি 1 40 রেকর্ড আছে, উপরের কোড সারি 10 থেকে টেনে শুরু হবে।
yy
আপনি টেবিল থেকে টান করতে চান রেকর্ডস / সারি সংখ্যা।
পূর্ববর্তী উদাহরণটি তৈরি করতে: যদি টেবিল 1-এর 40 টি রেকর্ড থাকে এবং আপনি 10 সারি থেকে টানতে শুরু করেন এবং 10 এর নেক্সট সেটটি ধরে ফেলেন (yy
) । এর অর্থ হ'ল, উপরের কোডটি সারণি 1 থেকে 10 সারি থেকে শুরু করে 20 এ শেষ হবে। রেকর্ডগুলি টানবে Thus এভাবে সারিগুলি 10 - 20 এ টানতে হবে।
অফসেটে আরও তথ্যের জন্য লিঙ্কটি দেখুন
SELECT *
FROM (
SELECT TOP 20
t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
FROM table1 t
ORDER BY
field1
) t
WHERE rn > 10
সিনট্যাক্টিক্যালি মাইএসকিউএল লিমিটেড কোয়েরিটি হ'ল এইরকম:
SELECT * FROM table LIMIT OFFSET, ROW_COUNT
এটি মাইক্রোসফ্ট এসকিউএল সার্ভারে অনুবাদ করা যেতে পারে
SELECT * FROM
(
SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
FROM table
) a
WHERE rnum > OFFSET
এখন আপনার জিজ্ঞাসাটি এর select * from table1 LIMIT 10,20
মতো হবে:
SELECT * FROM
(
SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum
FROM table1
) a
WHERE rnum > 10
এমএস সার্ভার ব্যবহার করা এড়ানোর চেষ্টা করার একটি কারণ এটি ... তবে যাইহোক। কখনও কখনও আপনার কাছে কেবল বিকল্প নেই (ইয়ে! এবং আমাকে একটি পুরানো সংস্করণ ব্যবহার করতে হবে !!)।
আমার পরামর্শটি ভার্চুয়াল টেবিল তৈরি করা:
থেকে:
SELECT * FROM table
প্রতি:
CREATE VIEW v_table AS
SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table
তারপরে কেবল জিজ্ঞাসা করুন:
SELECT * FROM v_table WHERE row BETWEEN 10 AND 20
ক্ষেত্রগুলি যুক্ত করা বা অপসারণ করা হলে, "সারি" স্বয়ংক্রিয়ভাবে আপডেট হয়।
এই বিকল্পটির সাথে প্রধান সমস্যাটি হল অর্ডার বাই স্থির। সুতরাং আপনি যদি অন্য কোনও আদেশ চান তবে আপনাকে অন্য একটি ভিউ তৈরি করতে হবে।
হালনাগাদ
এই পদ্ধতির সাথে অন্য একটি সমস্যা রয়েছে: আপনি যদি আপনার ডেটা ফিল্টার করার চেষ্টা করেন তবে এটি প্রত্যাশার মতো কাজ করবে না। উদাহরণস্বরূপ, যদি আপনি এটি করেন:
SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20
10 থেকে 20 এর মধ্যে সারিগুলিতে থাকা সমস্ত ডেটা যেখানে সীমাবদ্ধ হয়ে যায় (পুরো ডেটাসেটটি সন্ধান করার পরিবর্তে এবং আউটপুট সীমিত করার পরিবর্তে)।
SELECT
*
FROM
(
SELECT
top 20 -- ($a) number of records to show
*
FROM
(
SELECT
top 29 -- ($b) last record position
*
FROM
table -- replace this for table name (i.e. "Customer")
ORDER BY
2 ASC
) AS tbl1
ORDER BY
2 DESC
) AS tbl2
ORDER BY
2 ASC;
-- Examples:
-- Show 5 records from position 5:
-- $a = 5;
-- $b = (5 + 5) - 1
-- $b = 9;
-- Show 10 records from position 4:
-- $a = 10;
-- $b = (10 + 4) - 1
-- $b = 13;
-- To calculate $b:
-- $b = ($a + position) - 1
-- For the present exercise we need to:
-- Show 20 records from position 10:
-- $a = 20;
-- $b = (20 + 10) - 1
-- $b = 29;
অবশ্যই চেষ্টা করা উচিৎ. নীচের ক্যোয়ারিতে আপনি গোষ্ঠী অনুসারে, ক্রম অনুসারে, সারিগুলি এড়িয়ে চলুন এবং সারি সীমাবদ্ধ করতে পারবেন।
select emp_no , sum(salary_amount) from emp_salary
Group by emp_no
ORDER BY emp_no
OFFSET 5 ROWS -- Skip first 5
FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows
SELECT TOP 10 * FROM table;
হিসাবে একই
SELECT * FROM table LIMIT 0,10;
এমএসএসকিউএলে সীমাবদ্ধতা বাস্তবায়ন সম্পর্কে এখানে একটি নিবন্ধ এখানে একটি দুর্দান্ত পড়া, বিশেষত মন্তব্যসমূহ।
এসকিউএলে কোনও সীমাবদ্ধ কীওয়ার্ড নেই। আপনার যদি কেবল সীমিত সংখ্যক সারি প্রয়োজন হয় আপনার একটি শীর্ষ কীওয়ার্ড ব্যবহার করা উচিত যা একটি LIMIT এর মতো।
যদি আপনার আইডি অনন্য শনাক্তকারী প্রকারের হয় বা আপনার আইডিতে টেবিলটি সাজানো না হয় তবে আপনাকে নীচের মতো এটি করতে হবে।
select * from
(select ROW_NUMBER() OVER (ORDER BY (select 0)) AS RowNumber,* from table1) a
where a.RowNumber between 2 and 5
কোডটি হবে
সীমা 2,5 থেকে * নির্বাচন করুন
এমএসএসকিউএলএক্সপ্রেস 2017 এ এটি আরও ভাল ব্যবহার করুন।
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) as [Count], * FROM table1
) as a
WHERE [Count] BETWEEN 10 and 20;
- একটি কলাম প্রদান করা [গণনা] এবং প্রতিটি ক্রমকে কিছু অর্ডার না করে একটি অনন্য গণনা নির্ধারণ করুন তারপরে আবার নির্বাচন করুন যেখানে আপনি নিজের সীমা সরবরাহ করতে পারেন .. :)
নীচের হিসাবে ফলাফল পাওয়ার সম্ভাব্য উপায়গুলির একটি, আশা করি এটি সাহায্য করবে।
declare @start int
declare @end int
SET @start = '5000'; -- 0 , 5000 ,
SET @end = '10000'; -- 5001, 10001
SELECT * FROM (
SELECT TABLE_NAME,TABLE_TYPE, ROW_NUMBER() OVER (ORDER BY TABLE_NAME) as row FROM information_schema.tables
) a WHERE a.row > @start and a.row <= @end
যদি আমি সঠিকভাবে মনে রাখি (এসকিউএল সার্ভারের সাথে ডাব করার পরে কিছুক্ষণ হয়ে গেছে) আপনি এরকম কিছু ব্যবহার করতে সক্ষম হতে পারেন: (২০০৫ এবং পরবর্তী)
SELECT
*
,ROW_NUMBER() OVER(ORDER BY SomeFields) AS [RowNum]
FROM SomeTable
WHERE RowNum BETWEEN 10 AND 20
WHERE
একই স্তরের ধারাটিতে সংজ্ঞায়িত কোনও উপনামে রেফারেন্স করতে পারবেন না SELECT
।