একটি এসকিউএল ডাটাবেস সারণিতে নবম সারিটি কীভাবে নির্বাচন করবেন?


399

আমি একটি ডাটাবেস টেবিল থেকে n ম সারিটি নির্বাচন করার কয়েকটি (আদর্শভাবে) ডাটাবেস অজ্ঞানী পদ্ধতি শিখতে আগ্রহী । নিম্নলিখিত ডাটাবেসের স্থানীয় কার্যকারিতা ব্যবহার করে কীভাবে এটি অর্জন করা যায় তাও আকর্ষণীয় হবে:

  • SQL সার্ভার
  • মাইএসকিউএল
  • পোস্টগ্রি
  • SQLite
  • আকাশবাণী

আমি বর্তমানে এসকিউএল সার্ভার ২০০৫-এ নিম্নলিখিতগুলির মতো কিছু করছি, তবে আমি অন্যের আরও অজ্ঞাবলিক পদ্ধতিগুলি দেখতে আগ্রহী:

WITH Ordered AS (
SELECT ROW_NUMBER() OVER (ORDER BY OrderID) AS RowNumber, OrderID, OrderDate
FROM Orders)
SELECT *
FROM Ordered
WHERE RowNumber = 1000000

উপরের এসকিউএল এর ক্রেডিট: ফিরোজ আনসারীর ওয়েবলগ

আপডেট: এসকিউএল স্ট্যান্ডার্ড সম্পর্কিত ট্রয়েস আরভিনের উত্তর দেখুন । ট্রয়লস, আমরা উদ্ধৃত করতে পারি এমন কোনও লিঙ্ক আছে?


3
হ্যাঁ. আইএসও এসকিউএল স্ট্যান্ডার্ড সম্পর্কে তথ্যের লিঙ্কটি এখানে রয়েছে: troels.arvin.dk/db/rdbms/links/#
Troels Arvin

13
কেবল উল্লেখ করার জন্য যে কোনও সম্পর্কের সংজ্ঞা অনুসারে একটি টেবিলের সারিগুলিতে অর্ডার নেই, সুতরাং একটি টেবিলের Nth সারিটি নির্বাচন করা যায় না। যা নির্বাচিত হতে পারে তা হল একটি সারিতে সেট করা নবম সারির (বাকি অংশে) একটি ক্যোয়ারী, যা আপনার উদাহরণ এবং অন্যান্য সমস্ত উত্তর পূরণ করে। বেশিরভাগের পক্ষে এটি কেবল শব্দার্থবিজ্ঞান হতে পারে তবে এটি প্রশ্নের অন্তর্নিহিত সমস্যাটিকে নির্দেশ করে। যদি আপনার ফিরে আসতে হয় OrderNo N, তবে সারণিতে একটি অর্ডারসিকোয়েন্সনো কলাম প্রবর্তন করুন এবং একটি নতুন ক্রম তৈরির পরে এটি একটি স্বাধীন ক্রম জেনারেটর থেকে উত্পন্ন করুন ।
দামির সুদারেভিক

2
এসকিউএল স্ট্যান্ডার্ড বিকল্পটি সংজ্ঞায়িত করে offset x fetch first y rows only। বর্তমানে কমপক্ষে পোস্টগ্র্রেস, ওরাকল 12, ডিবি 2 দ্বারা সমর্থিত।
a_horse_with_no_name

উত্তর:


349

স্ট্যান্ডার্ডের alচ্ছিক অংশগুলিতে এটি করার বিভিন্ন উপায় রয়েছে তবে প্রচুর ডাটাবেসগুলি এটি করার নিজস্ব পদ্ধতিটিকে সমর্থন করে।

একটি সত্যই ভাল সাইট যা এই এবং অন্যান্য বিষয়ে কথা বলে তা হ'ল http://troels.arvin.dk/db/rdbms/#select-limit

মূলত, পোস্টগ্রেএসকিউএল এবং মাইএসকিউএল অ-মানককে সমর্থন করে:

SELECT...
LIMIT y OFFSET x 

ওরাকল, ডিবি 2 এবং এমএসএসকিউএল স্ট্যান্ডার্ড উইন্ডোটিং ফাংশনগুলি সমর্থন করে:

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownumber,
    columns
  FROM tablename
) AS foo
WHERE rownumber <= n

(যা আমি উপরে লিঙ্ক করা সাইট থেকে কেবল অনুলিপি করেছি যেহেতু আমি কখনই সেই ডিবি ব্যবহার করি না)

আপডেট: পোস্টগ্রিজ এসকিউএল ৮.৪ হিসাবে স্ট্যান্ডার্ড উইন্ডোটিং ফাংশন সমর্থিত, সুতরাং দ্বিতীয় উদাহরণটি পোস্টগ্র্রেএসকিউএল-তেও কাজ করা আশা করি।

আপডেট: এসকিউএলাইট উইন্ডো ফাংশন সমর্থন 2018-09-15 এ 3.25.0 সংস্করণে সমর্থন করে যাতে উভয় ফর্ম এসকিউএলাইটেও কাজ করে।


3
মাইএসকিউএল অফসেট এবং লিমিট সিনট্যাক্সও ব্যবহার করে। ফায়ারবার্ড FIRST এবং এসকিআইপি কীওয়ার্ড ব্যবহার করে তবে সেগুলি নির্বাচন করার পরে ঠিক রাখা হয়।
ডগ

7
এটি কি WHERE rownumber = nকেবলমাত্র নবম সারি পাওয়া উচিত নয় ?
স্টিভ বেনেট

মাইএসকিউএল ৮. সংস্করণ থেকে উইন্ডো ফাংশন সমর্থন করে সংস্করণ 10.2 থেকে মারিয়াডিবি
পল স্পিগেল

101

পোস্টগ্র্রেএসকিউএল এসকিউএল স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত হিসাবে উইন্ডোটিং ফাংশন সমর্থন করে, তবে তারা বিশ্রী হয়, তাই বেশিরভাগ লোক (অ-মানক) LIMIT/OFFSET : ব্যবহার করে

SELECT
    *
FROM
    mytable
ORDER BY
    somefield
LIMIT 1 OFFSET 20;

এই উদাহরণটি 21 তম সারি নির্বাচন করে। OFFSET 20পোস্টগ্র্রেসকে প্রথম 20 টি রেকর্ড বাদ দিতে বলছে। আপনি যদি একটি ORDER BYধারা উল্লেখ না করে থাকেন তবে কোন রেকর্ড আপনি ফিরে পাবেন তার কোনও গ্যারান্টি নেই, যা খুব কমই কার্যকর।


31

আমি বাকি কোনওটির বিষয়ে নিশ্চিত নই, তবে আমি জানি এসকিউএলাইট এবং মাইএসকিউএলের কোনও "ডিফল্ট" সারি ক্রম নেই। এই দুটি উপভাষায়, কমপক্ষে, নিম্নলিখিত স্নিপেটটি_তালিকা থেকে 15 তম প্রবেশটি গ্রহণ করেছে, এটি যোগ করার তারিখ / সময় অনুসারে বাছাই করে:

SELECT * FROM the_table ORDER BY added DESC LIMIT 1,15

(অবশ্যই, আপনার একটি অতিরিক্ত DATETIME ক্ষেত্র থাকা উচিত এবং এন্ট্রিটি যুক্ত হওয়ার তারিখ / সময়টিতে সেট করা ...)


এটি ইনলাইন অফসেট মান সহ ক্যোয়ারিকে সীমাবদ্ধ করার সর্বোত্তম উপায় বলে মনে হচ্ছে। তবে আমাদের এখানে 0,14 ব্যবহার করা উচিত নয়? 1,15 প্রথম সারিতে চলে যাবে।
গ্ল্যাডিয়েটর

15 এর অর্থ কী? আমি জানি 1 জন একটি রেকর্ড পেতে বলে। কমাটি ব্যবহৃত হয়নি উদাহরণটিতে আমি 1keydata.com/sql/sql-limit.html
প্রতিশ্রুতিবদ্ধ

1
প্রকৃতপক্ষে, এখান থেকে php.about.com/od/mysqlcommands/g/Limit_sql.htm , আপনি 15 তম এন্ট্রি ধরতে চাইলে আপনি লিমিটেড 14 করবেন না, 1 (0 তমটি প্রথম উপাদান, দৈর্ঘ্যের 1
প্রতিশ্রুতিবদ্ধ

এটি _ টেবিলের অর্ডার থেকে নির্বাচন করুন * DESC
লিমিটেড

25

এসকিউএল 2005 এবং উপরের এই বৈশিষ্ট্যটি অন্তর্নির্মিত রয়েছে। ROW_NUMBER () ফাংশনটি ব্যবহার করুন। এটি << পূর্ববর্তী এবং পরবর্তী >> শৈলীর ব্রাউজিং সহ ওয়েব পৃষ্ঠাগুলির জন্য দুর্দান্ত:

বাক্য গঠন:

SELECT
    *
FROM
    (
        SELECT
            ROW_NUMBER () OVER (ORDER BY MyColumnToOrderBy) AS RowNum,
            *
        FROM
            Table_1
    ) sub
WHERE
    RowNum = 23

আমি এই সমাধানটি পছন্দ করি, কারণ এটি আরও সোজা সামনে অনুভব করে।
ফক্সআর্ক

18

আমি সন্দেহ করি এটি বন্যভাবে অদক্ষ তবে এটি একটি সহজ পদ্ধতির, যা আমি চেষ্টা করেছি এমন একটি ছোট্ট ডেটাসেটে কাজ করেছিল।

select top 1 field
from table
where field in (select top 5 field from table order by field asc)
order by field desc

এটি 5 তম আইটেমটি পাবে, দ্বিতীয় শীর্ষ নম্বরটি পরিবর্তিত করে একটি পৃথক নবম আইটেম পাবে

কেবলমাত্র এসকিউএল সার্ভার (আমার মনে হয়) তবে পুরানো সংস্করণগুলিতে কাজ করা উচিত যা ROW_NUMBER () সমর্থন করে না।


আমি এটি ব্যবহার করতে যাচ্ছি ROW_NUMBER () এসকিউএল 2000 তে কাজ করে না (হ্যাঁ, এসকিউএল 2000 এ এখনও আমাদের ক্লায়েন্ট রয়েছে) বিশেষত, আমি একটি লুপের পুনরুক্তি ভেরিয়েবলের সাথে '5' প্রতিস্থাপন করতে যাচ্ছি যেগুলি টেবিলের প্রতিটি সারি অনুলিপি করে অনুলিপি করতে পারে। হতে পারে কেউ এই মন্তব্যটি দেখতে পাবেন এবং এই
দরকারীটি


14

এটি এসকিউএল সার্ভারে যাচাই করুন:

Select top 10 * From emp 
EXCEPT
Select top 9 * From emp

এটি আপনাকে এমপ টেবিলের 10 তম ROW দেবে!


আপনি ইতিমধ্যে এখানে এই প্রশ্নের উত্তর সরবরাহ করেছেন যা আপনার মনে হয় যে উত্তরটি সঠিক নয় Delete যদি আপনি উভয় উত্তরই ঠিক বলে মনে করেন তবে উত্তর দুটি এক জায়গায় পোস্ট করুন
স্প্রিংলিয়নার

11

কিছু উত্তরের দাবিগুলির বিপরীতে, এসকিউএল মান এই বিষয়ে নিরব নয়।

এসকিউএল: ২০০৩ সাল থেকে আপনি সারিগুলি এড়াতে এবং ফলাফলের সেটগুলি সীমাবদ্ধ করতে "উইন্ডো ফাংশন" ব্যবহার করতে সক্ষম হয়েছেন।

এবং এসকিউএল: ২০০৮ এ, ব্যবহার করে কিছুটা সহজ পদ্ধতির যোগ করা হয়েছিল
OFFSET skip ROWS FETCH FIRST n ROWS ONLY

ব্যক্তিগতভাবে, আমি মনে করি না যে এসকিউএল: ২০০৮ এর সংযোজনটি সত্যই প্রয়োজন ছিল, তাই যদি আমি আইএসও থাকতাম তবে আমি এটিকে ইতিমধ্যে বরং বড় স্ট্যান্ডার্ডের বাইরে রাখতাম।


তার চমৎকার নেই একটি প্রমিত যদিও নিজেকে জীবনে মত মানুষ করে তোলে আরও সহজ, এবং তাই সুন্দর একটি প্রমিত ভাবে :) উপাদান কি মাইক্রোসফট
user230910

7

আমরা যখন এমএসএসকিউএল 2000 এ কাজ করতাম, তখন আমরা "ট্রিপল-ফ্লিপ" বলে যা করেছি:

সম্পাদিত

DECLARE @InnerPageSize int
DECLARE @OuterPageSize int
DECLARE @Count int

SELECT @Count = COUNT(<column>) FROM <TABLE>
SET @InnerPageSize = @PageNum * @PageSize
SET @OuterPageSize = @Count - ((@PageNum - 1) * @PageSize)

IF (@OuterPageSize < 0)
    SET @OuterPageSize = 0
ELSE IF (@OuterPageSize > @PageSize)
    SET @OuterPageSize = @PageSize

DECLARE @sql NVARCHAR(8000)

SET @sql = 'SELECT * FROM
(
    SELECT TOP ' + CAST(@OuterPageSize AS nvarchar(5)) + ' * FROM
    (
        SELECT TOP ' + CAST(@InnerPageSize AS nvarchar(5)) + ' * FROM <TABLE> ORDER BY <column> ASC
    ) AS t1 ORDER BY <column> DESC
) AS t2 ORDER BY <column> ASC'

PRINT @sql
EXECUTE sp_executesql @sql

এটি মার্জিত ছিল না, এবং এটি দ্রুত ছিল না, তবে এটি কার্যকর হয়েছিল।


বলুন আপনার 25 টি সারি রয়েছে এবং আপনি 10 টি সারি পৃষ্ঠার তৃতীয় পৃষ্ঠাটি অর্থাৎ 21-25 সারি চান। আন্তঃতম জিজ্ঞাসাটি শীর্ষ 30 টি সারি (সারি 1-25) পায়। মাঝের ক্যোয়ারিতে শেষ 10 টি সারি (25-16 সারি) পাওয়া যায়। বাহ্যিক ক্যোয়ারী তাদের পুনঃব্যবস্থা করে এবং সারিগুলি 16-25 এ ফিরে আসে। আপনি যদি 21-25 সারি চান তবে এটি স্পষ্টতই ভুল।
বিল কারভিন

এখন আমরা কোনও মাঝের পৃষ্ঠা চাইলে এটি কাজ করে না। বলুন আমাদের 25 টি সারি রয়েছে এবং আমরা দ্বিতীয় পৃষ্ঠাটি, অর্থাৎ সারিগুলি 11-20 চাই। অভ্যন্তরীণ কোয়েরিটি শীর্ষ 2 * 10 = 20 সারি বা সারিগুলিতে 1-20 পায়। মধ্যম ক্যোয়ারিতে সর্বশেষ 15 টি সারি পাওয়া যায়: 25 - ((2-1) * 10) = 15, যা 20-6 সারি দেয় yield শেষ ক্যোয়ারীটি অর্ডারটিকে বিপরীত করে এবং সারিগুলিকে 6-20 ফেরত দেয়। এই কৌশলটি কার্যকর হয় না, যদি না মোট সারিগুলির সংখ্যা আপনার পছন্দসই পৃষ্ঠার আকারের একাধিক হয়।
বিল কারভিন

সম্ভবত সেরা উপসংহারটি হ'ল আমাদের যে কোনও এমএস এসকিউএল সার্ভার 2000 ইনস্ট্যান্স আপগ্রেড করা উচিত। :-) এটি প্রায় 2012, এবং এই সমস্যাটি বেশ কয়েক বছর ধরে আরও ভাল উপায়ে সমাধান করা হয়েছে!
বিল কারভিন

@ বিল কারভিন: গণনার IF / ELSE IFনীচের ব্লকগুলি নোট করুন OuterPageSize- 1 এবং 2 পৃষ্ঠাগুলিতে, তারা OuterPageSizeমানটি 10 ​​এ ফিরে আসবে 3 পৃষ্ঠায় (সারি 21-25) গণনাটি সঠিকভাবে 5 এবং 4 এবং আরও বেশি পৃষ্ঠায় ফিরে আসবে, গণনা থেকে নেতিবাচক ফলাফল 0 দ্বারা প্রতিস্থাপন করা হবে (যদিও এটি সম্ভবত এই মুহুর্তে খালি ডেটা সারিটি ফিরিয়ে দেওয়া আরও দ্রুত হবে)।
অ্যাডাম ভি

ওহ আমি এখন দেখতে। ঠিক আছে, আমি আমার মতে দাঁড়াচ্ছি যে আজ এমএস এসকিউএল সার্ভার 2000 ব্যবহার করা ঝামেলার পক্ষে নয়।
বিল কারভিন

6

SQL সার্ভার


উপরে থেকে 'র রেকর্ড নির্বাচন করুন

SELECT * FROM (
SELECT 
ID, NAME, ROW_NUMBER() OVER(ORDER BY ID) AS ROW
FROM TABLE 
) AS TMP 
WHERE ROW = n

নীচে থেকে 'র রেকর্ড নির্বাচন করুন

SELECT * FROM (
SELECT 
ID, NAME, ROW_NUMBER() OVER(ORDER BY ID DESC) AS ROW
FROM TABLE 
) AS TMP 
WHERE ROW = n

5

ওরাকল:

select * from (select foo from bar order by foo) where ROWNUM = x

1
where ROWNUM = xকেবল ওরাকল ডিবিতে x = 1 এর জন্য কাজ করবে। অর্থাত্ where ROWNUM = 2কোনও সারি ফেরত দেবে না।
এফ

5

ওরাকল 12 সি তে আপনি OFFSET..FETCH..ROWS বিকল্পটি ব্যবহার করতে পারেনORDER BY

উদাহরণস্বরূপ, শীর্ষ থেকে তৃতীয় রেকর্ড পেতে:

SELECT * 
FROM   sometable
ORDER BY column_name
OFFSET 2 ROWS FETCH NEXT 1 ROWS ONLY;

4

আপনার বিভ্রান্তির একটি দ্রুত সমাধান এখানে।

SELECT * FROM table ORDER BY `id` DESC LIMIT N, 1

এখানে আপনি N = 0 পূরণের দ্বারা সর্বশেষ সারিটি পেতে পারেন, N = 1 দ্বারা দ্বিতীয় স্থানে, চতুর্থ শেষটি N = 3 পূরণ করে on

এটি সাক্ষাত্কারের উপর খুব সাধারণ প্রশ্ন এবং এটি এটির খুব সাধারণ উত্তর।

আরও আপনি যদি নিজের চেয়ে পরিমাণ, আইডি বা কিছু সংখ্যার বাছাইয়ের আদেশ চান তবে মাইএসকিউএল-এ CAST ফাংশনের জন্য যেতে পারে।

SELECT DISTINCT (`amount`) FROM cart ORDER BY CAST( `amount` AS SIGNED ) DESC LIMIT 4 , 1

এখানে এন = 4 পূরণের মাধ্যমে আপনি কার্টের টেবিল থেকে সর্বাধিক পরিমাণের পঞ্চম সর্বশেষ রেকর্ড পেতে সক্ষম হবেন। আপনি আপনার ক্ষেত্র এবং টেবিলের নামটি ফিট করতে পারেন এবং সমাধান নিয়ে আসতে পারেন।



3

উদাহরণস্বরূপ, আপনি যদি এমএসএসকিউএলে প্রতি দশম সারিটি নির্বাচন করতে চান তবে আপনি ব্যবহার করতে পারেন;

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY ColumnName1 ASC) AS rownumber, ColumnName1, ColumnName2
  FROM TableName
) AS foo
WHERE rownumber % 10 = 0

আপনি কেবলমাত্র এমওডিকে নিন এবং 10 নম্বর পরিবর্তন করুন আপনার পছন্দসই সংখ্যাটি।


3

এসকিউএল সার্ভারের জন্য, সারি নম্বর দিয়ে যাওয়ার একটি জেনেরিক উপায় হ'ল:

SET ROWCOUNT @row --@row = the row number you wish to work on.

উদাহরণ স্বরূপ:

set rowcount 20   --sets row to 20th row

select meat, cheese from dbo.sandwich --select columns from table at 20th row

set rowcount 0   --sets rowcount back to all rows

এটি 20 তম সারির তথ্য ফিরিয়ে দেবে। পরে 0 টি সারিতে সরাতে নিশ্চিত হন।


2

লিমিট এন, 1 এম এস এসকিউএল সার্ভারে কাজ করে না। আমি মনে করি এটি কেবলমাত্র প্রধান ডেটাবেস সম্পর্কে যা এই সিনট্যাক্সটিকে সমর্থন করে না। সত্য কথা বলতে গেলে এটি এসকিউএল স্ট্যান্ডার্ডের অংশ নয়, যদিও এটি এতটা ব্যাপকভাবে সমর্থিত যে এটি হওয়া উচিত। এসকিউএল সার্ভার ছাড়া সমস্ত কিছুতে LIMIT দুর্দান্ত কাজ করে। এসকিউএল সার্ভারের জন্য, আমি একটি মার্জিত সমাধান খুঁজে পেতে সক্ষম হইনি।


1
ওরাকল, ডিবি 2 ব্যতীত পুরো বিশ্বের প্রতিটি এন্টারপ্রাইজ স্তরের ডাটাবেস সম্পর্কে ভাল। পোস্টগ্রাইএসকিউএল একমাত্র এন্টারপ্রাইজ সক্ষম ডাটাবেস যা লিমিটেড কীওয়ার্ডকে সমর্থন করে এবং এটি বেশিরভাগ কারণ ওপেন সোর্স হওয়ায় এটি এসিআইডি উপেক্ষাকারী মাইএসকিউএল ভিড়ের কাছে পৌঁছনীয় হওয়া দরকার।
ডেভিড

3
@ অ্যালেক্সডি এই "উত্তরটি" মন্তব্য কার্যকর করার আগে স্ট্যাকওভারফ্লোয়ের পুরানো দিনগুলিতে ফিরে পোস্ট করা হয়েছিল। আমি এটিকে অন্য উত্তরের মন্তব্য হিসাবে পোস্ট করতাম তবে সময় মতামত উপস্থিত ছিল না।
কিবিবি

2

আমি সম্প্রতি ওরাকল এর জন্য লিখেছি এমন একটি স্প্রোকের জেনেরিক সংস্করণ যা গতিশীল পেজিং / বাছাইয়ের অনুমতি দেয় - এইচটিএইচ

-- p_LowerBound = first row # in the returned set; if second page of 10 rows,
--                this would be 11 (-1 for unbounded/not set)
-- p_UpperBound = last row # in the returned set; if second page of 10 rows,
--                this would be 20 (-1 for unbounded/not set)

OPEN o_Cursor FOR
SELECT * FROM (
SELECT
    Column1,
    Column2
    rownum AS rn
FROM
(
    SELECT
        tbl.Column1,
        tbl.column2
    FROM MyTable tbl
    WHERE
        tbl.Column1 = p_PKParam OR
        tbl.Column1 = -1
    ORDER BY
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 1, Column1, 'X'),'X'),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 1, Column1, 'X'),'X') DESC,
        DECODE(p_sortOrder, 'A', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate),
        DECODE(p_sortOrder, 'D', DECODE(p_sortColumn, 2, Column2, sysdate),sysdate) DESC
))
WHERE
    (rn >= p_lowerBound OR p_lowerBound = -1) AND
    (rn <= p_upperBound OR p_upperBound = -1);

2

তবে সত্যই, এই সমস্ত কি প্রথম জায়গায় ভাল ডাটাবেস ডিজাইনের জন্য কেবল পার্লার ট্রিকস নয়? আমার যেমন কয়েকবার কার্যকারিতার প্রয়োজন হয়েছিল ততক্ষণে একটি দ্রুত প্রতিবেদন তৈরি করা সাধারণ প্রশ্নের জন্য query যে কোনও বাস্তব কাজের জন্য, এই জাতীয় কৌশল ব্যবহার করা ঝামেলার আমন্ত্রণ জানায়। যদি কোনও নির্দিষ্ট সারি নির্বাচন করা প্রয়োজন হয় তবে কেবল একটি ক্রমিক মান সহ একটি কলাম করুন এবং এটি দিয়ে সম্পন্ন করুন।


2

এসকিউএল সার্ভারের জন্য, নিম্নলিখিতগুলি সারণী প্রদান থেকে প্রথম সারিতে ফিরে আসবে।

declare @rowNumber int = 1;
    select TOP(@rowNumber) * from [dbo].[someTable];
EXCEPT
    select TOP(@rowNumber - 1) * from [dbo].[someTable];

আপনি এই জাতীয় কিছু দিয়ে মানগুলি লুপ করতে পারেন:

WHILE @constVar > 0
BEGIN
    declare @rowNumber int = @consVar;
       select TOP(@rowNumber) * from [dbo].[someTable];
    EXCEPT
       select TOP(@rowNumber - 1) * from [dbo].[someTable];  

       SET @constVar = @constVar - 1;    
END;

1

সিবাজ এসকিউএল যে কোনও জায়গায়:

SELECT TOP 1 START AT n * from table ORDER BY whatever

অর্ডার বা এটি অর্থহীন তা ভুলে যাবেন না।


1

টি-এসকিউএল - একটি টেবিল থেকে N'th রেকর্ড নম্বর নির্বাচন করা

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from TableName) T where T.Rno = RecordNumber

Where  RecordNumber --> Record Number to Select
       TableName --> To be Replaced with your Table Name

উদাহরণস্বরূপ, কোনও সারণী কর্মচারী থেকে 5 তম রেকর্ড নির্বাচন করার জন্য, আপনার ক্যোয়ারী হওয়া উচিত

select * from
 (select row_number() over (order by Rand() desc) as Rno,* from Employee) T where T.Rno = 5


1
SELECT
    top 1 *
FROM
    table_name
WHERE
    column_name IN (
        SELECT
            top N column_name
        FROM
            TABLE
        ORDER BY
            column_name
    )
ORDER BY
    column_name DESC

আমি এই ক্যোয়ারীটি নবম সারিটি অনুসন্ধান করার জন্য লিখেছি। এই প্রশ্নের সাথে উদাহরণ হবে

SELECT
    top 1 *
FROM
    Employee
WHERE
    emp_id IN (
        SELECT
            top 7 emp_id
        FROM
            Employee
        ORDER BY
            emp_id
    )
ORDER BY
    emp_id DESC

0

অবিশ্বাস্য যে আপনি এটি চালিত কোনও এসকিউএল ইঞ্জিন খুঁজে পেতে পারেন ...

WITH sentence AS
(SELECT 
    stuff,
    row = ROW_NUMBER() OVER (ORDER BY Id)
FROM 
    SentenceType
    )
SELECT
    sen.stuff
FROM sentence sen
WHERE sen.row = (ABS(CHECKSUM(NEWID())) % 100) + 1

0

আমার মতো কচি ব্যবহার না করার ক্ষেত্রে অভিনব, কোনও বিশেষ ক্রিয়াকলাপের কিছুই নেই ...

SELECT TOP 1 * FROM (
  SELECT TOP n * FROM <table>
  ORDER BY ID Desc
)
ORDER BY ID ASC

দেওয়া হয়েছে যে আপনার একটি আইডি কলাম বা একটি ডেটস্ট্যাম্প কলাম রয়েছে যে আপনি বিশ্বাস করতে পারেন।


0

এইভাবে আমি এটি ডিবি 2 এসকিউএল এর মধ্যে করব, আমি বিশ্বাস করি যে আরআরএন (আপেক্ষিক রেকর্ড নম্বর) ও / এস দ্বারা টেবিলের মধ্যে সংরক্ষণ করা হয়েছে;

SELECT * FROM (                        
   SELECT RRN(FOO) AS RRN, FOO.*
   FROM FOO                         
   ORDER BY RRN(FOO)) BAR             
 WHERE BAR.RRN = recordnumber

0
select * from 
(select * from ordered order by order_id limit 100) x order by 
x.order_id desc limit 1;

প্রথমে আরোহণে অর্ডার করে শীর্ষ 100 টি সারি নির্বাচন করুন এবং তারপরে অবতরণ এবং সীমাতে অর্ডার দিয়ে শেষ সারিটি নির্বাচন করুন 1 তবে এটি দুটি বার অ্যাক্সেস করার কারণে এটি একটি অত্যন্ত ব্যয়বহুল বক্তব্য।


0

আমার কাছে মনে হয়, দক্ষ হওয়ার জন্য, আপনার প্রয়োজন 1) ডাটাবেস রেকর্ডের সংখ্যার চেয়ে 0 এবং একের কমের মধ্যে একটি এলোমেলো সংখ্যা তৈরি করা এবং 2) সেই অবস্থানটিতে সারিটি নির্বাচন করতে সক্ষম হতে হবে। দুর্ভাগ্যক্রমে, বিভিন্ন ডাটাবেসের বিভিন্ন এলোমেলো সংখ্যা জেনারেটর এবং ফলাফল সেটের একটি অবস্থানে একটি সারি নির্বাচন করার বিভিন্ন উপায় রয়েছে - সাধারণত আপনি নির্দিষ্ট করে দেন যে কতগুলি সারি বাদ দিতে হবে এবং কত সারি আপনি চান, তবে এটি বিভিন্ন ডাটাবেসের জন্য আলাদাভাবে সম্পন্ন হয়েছে। এসকিউএলাইটে আমার জন্য এমন কিছু এখানে রয়েছে:

select * 
from Table 
limit abs(random()) % (select count(*) from Words), 1;

এটি সীমাবদ্ধতা ধারাতে সাবকিউরি ব্যবহার করতে সক্ষম হওয়ার উপর নির্ভর করে (যা এসকিউএলাইটে সীমাবদ্ধ থাকে <বিঘ্নিত হওয়া> << recs>) একটি সারণীতে রেকর্ডের সংখ্যা নির্বাচন করা বিশেষভাবে দক্ষ হওয়া উচিত, ডাটাবেসের অংশ হিসাবে মেটা ডেটা, কিন্তু এটি ডাটাবেসের বাস্তবায়নের উপর নির্ভর করে। এছাড়াও, আমি জানি না যে ক্যোরিটি আসলে নবম রেকর্ডটি পুনরুদ্ধার করার আগে ফলাফল সেটটি তৈরি করবে কিনা তবে আমি আশা করব যে এটির দরকার নেই। নোট করুন যে আমি একটি "আদেশ বাই" ধারাটি নির্দিষ্ট করছি না। প্রাথমিক কী এর মতো কিছু "অর্ডার" করা ভাল, যার একটি সূচক থাকবে - সূচী থেকে Nth রেকর্ড পাওয়া দ্রুততর হতে পারে যদি ডাটাবেস নিজেই ফলাফল সেটটি তৈরি না করেই ডাটাবেস থেকে Nth রেকর্ড না পেতে পারে ।


0

সিকিএল সার্ভারের জন্য এই নিবন্ধে সর্বাধিক উপযুক্ত উত্তর আমি দেখেছি

WITH myTableWithRows AS (
    SELECT (ROW_NUMBER() OVER (ORDER BY myTable.SomeField)) as row,*
    FROM myTable)
SELECT * FROM myTableWithRows WHERE row = 3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.