অর্ডার দেওয়ার পরে আমি কীভাবে একটি ওরাকল ক্যোয়ারী দ্বারা ফিরে আসা সারির সংখ্যা সীমাবদ্ধ করব?


1031

কোনও Oracleক্লোজের মতো কোনও প্রশ্নের কোনও ব্যবহার করার উপায় আছে কি MySQL limit?

ইন MySQL, আমি এটি করতে পারি:

select * 
from sometable
order by name
limit 20,10

30 তম সারিতে 21 তম পেতে (প্রথম 20 এড়িয়ে যান, পরবর্তী 10 দিন)। সারিগুলি এর পরে নির্বাচিত হয় order by, সুতরাং এটি সত্যিই 20 তম নামের বর্ণমুখে শুরু হয়।

এর মধ্যে Oracle, লোকেরা কেবলমাত্র rownumসিউডো-কলামটিই উল্লেখ করে তবে এটির আগে মূল্যায়ন করা হয় order byযার অর্থ এটি:

select * 
from sometable
where rownum <= 10
order by name

নাম অনুসারে অর্ডার করা দশ সারির একটি এলোমেলো সেট প্রদান করবে, যা সাধারণত আমি চাই না। এটি কোনও অফসেট নির্দিষ্ট করার অনুমতি দেয় না।


16
এসকিউএল: 2008-তে প্রমিত করা হয়েছে।
ডালে

14
সীমা ওরাকল 12C জন্য টম Kyte দ্বারা ঘোষণা করা হয় ...
wolφi

14
ফলাফলের সেটটিতে পরবর্তী পৃষ্ঠাটি আনছেন?
ম্যাথিউ লংটিন

3
@ ইয়ারোস্লাভশাবলিন বিশেষত, একটি পৃষ্ঠাগুলি অনুসন্ধান সর্বদা এই প্যাটার্নটি ব্যবহার করে । যে কোনও ধরণের অনুসন্ধান ফাংশন সহ প্রায় কোনও অ্যাপই এটি ব্যবহার করতে চলেছে। আর একটি ব্যবহারের ক্ষেত্রে দীর্ঘ তালিকা বা টেবিল ক্লায়েন্টের কেবলমাত্র অংশ লোড করা এবং ব্যবহারকারীকে প্রসারিত করার বিকল্প প্রদান করা হবে।
jpmc26

3
@ ইয়ারোস্লাভশাবালিন অন্তর্নিহিত ডেটাগুলির কারণে পরিবর্তন না করা আপনি আলাদা ফলাফল সেট পেতে পারবেন না ORDER BY। এটি প্রথমে অর্ডার দেওয়ার পুরো বিষয়টি। অন্তর্নিহিত ডেটা যদি পরিবর্তিত হয় এবং এর কারণে আপনার ফলাফল সেট হয়ে যায়, তবে ব্যবহারকারী কেন পুরানো তথ্যের পরিবর্তে আপডেট হওয়া ফলাফলগুলি প্রদর্শন করবেন না? এছাড়াও, রাষ্ট্র পরিচালনা যতটা সম্ভব এড়ানোর জন্য একটি প্লেগ। এটি জটিলতা এবং বাগগুলির একটি ধ্রুবক উত্স; ফাংশনাল এত জনপ্রিয় হয়ে উঠছে যে কারণে। এবং কখন আপনি মেমরিতে পুরো ফলাফল সেট শেষ করতে জানবেন? ওয়েবে, ব্যবহারকারী কখন চলে যাবে তা জানার কোনও উপায় আপনার কাছে নেই।
jpmc26

উত্তর:


619

ওরাকল 12C R1 (12.1) থেকে শুরু করে, সেখানে হয় একটি সারি দফা সীমিত । এটি পরিচিত LIMITসিনট্যাক্স ব্যবহার করে না , তবে এটি আরও বিকল্পের সাহায্যে আরও ভাল কাজ করতে পারে। আপনি এখানে পুরো বাক্য গঠনটি খুঁজে পেতে পারেন । ( এই উত্তরে ওরাকলে এটি কীভাবে অভ্যন্তরীণভাবে কাজ করে সে সম্পর্কে আরও পড়ুন )।

মূল প্রশ্নের উত্তর দিতে, এখানে ক্যোয়ারীটি দেওয়া হয়েছে:

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

(পূর্বের ওরাকল সংস্করণগুলির জন্য, দয়া করে এই প্রশ্নের অন্যান্য উত্তরগুলি দেখুন)


উদাহরণ:

লিঙ্ক পচা রোধের আশায় লিঙ্কযুক্ত পৃষ্ঠা থেকে নিম্নলিখিত উদাহরণগুলি উদ্ধৃত হয়েছিল ।

সেটআপ

CREATE TABLE rownum_order_test (
  val  NUMBER
);

INSERT ALL
  INTO rownum_order_test
SELECT level
FROM   dual
CONNECT BY level <= 10;

COMMIT;

টেবিলে কী আছে?

SELECT val
FROM   rownum_order_test
ORDER BY val;

       VAL
----------
         1
         1
         2
         2
         3
         3
         4
         4
         5
         5
         6
         6
         7
         7
         8
         8
         9
         9
        10
        10

20 rows selected.

প্রথম Nসারি পান

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;

       VAL
----------
        10
        10
         9
         9
         8

5 rows selected.

প্রথম Nসারিটি পান , যদি Nতম সারিতে বন্ধন থাকে তবে সমস্ত বাঁধা সারি পান

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS WITH TIES;

       VAL
----------
        10
        10
         9
         9
         8
         8

6 rows selected.

xসারিগুলির শীর্ষ %

SELECT val
FROM   rownum_order_test
ORDER BY val
FETCH FIRST 20 PERCENT ROWS ONLY;

       VAL
----------
         1
         1
         2
         2

4 rows selected.

পৃষ্ঠপোষকতার জন্য খুব দরকারী একটি অফসেট ব্যবহার করা

SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

4 rows selected.

আপনি শতাংশের সাথে অফসেট একত্রিত করতে পারেন

SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 20 PERCENT ROWS ONLY;

       VAL
----------
         3
         3
         4
         4

4 rows selected.


1
কেবল প্রসারিত করার জন্য: OFFSET FETCHসিনট্যাক্স একটি সিনট্যাক্স চিনি। বিশদ
লুকাশজ সজ্জাদা

793

আপনি এই জাতীয় উপকরণ ব্যবহার করতে পারেন

select *
from  
( select * 
  from emp 
  order by sal desc ) 
where ROWNUM <= 5;

আরও তথ্যের জন্য ROWNUM বিষয়ে এবং সীমাবদ্ধ ফলাফলগুলি ওরাকল / এসক্টম এ দেখুন।

আপডেট : নিম্ন এবং উপরের উভয় সীমারেখার সাথে ফলাফলকে সীমাবদ্ধ করতে কিছুটা আরও বেশি ফুলে উঠেছে

select * from 
( select a.*, ROWNUM rnum from 
  ( <your_query_goes_here, with order by> ) a 
  where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum  >= :MIN_ROW_TO_FETCH;

(নির্দিষ্ট এস্কটম-নিবন্ধ থেকে অনুলিপি করা হয়েছে)

আপডেট 2 : ওরাকল 12 সি (12.1) দিয়ে শুরু করে সারি সীমাবদ্ধ করতে বা অফসেটে শুরু করার জন্য একটি বাক্য গঠন রয়েছে।

SELECT * 
FROM   sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

আরও উদাহরণের জন্য এই উত্তর দেখুন । ইঙ্গিতটির জন্য ক্রুমিয়াকে ধন্যবাদ।


5
এটি অবশ্যই এটি করার উপায়, তবে সচেতন থাকুন (যেমন জিজ্ঞাসা টম নিবন্ধটি বলেছে) আপনার সর্বাধিক রোভনাম বাড়ার সাথে সাথে ক্যোয়ারির কার্যকারিতা হ্রাস পাবে। এটি কোয়েরির ফলাফলগুলির জন্য একটি ভাল সমাধান যেখানে আপনি কেবল প্রথম কয়েকটি পৃষ্ঠাগুলি দেখতে চান তবে আপনি যদি পুরো টেবিলের মাধ্যমে কোড পৃষ্ঠাতে কোডের ব্যবস্থা হিসাবে ব্যবহার করেন তবে আপনার কোডটি পুনরায় সংশোধন করা ভাল
ক্রিস গিল ২

1
আপনার নিম্ন / উচ্চতর সংস্করণটি +1 আসলে আমাকে এমন একটি সমস্যা সম্পর্কে কাজ করতে সহায়তা করেছিল যেখানে কেবল উপরের-চৌম্বিত রোমনাম ক্লজটি আমার কোয়েরিটি মারাত্মকভাবে কমিয়ে দিচ্ছে।
কেলভিন

1
লেইফ রিফেল "কেবলমাত্র একটি নেস্টেড ক্যোয়ারী সহ বিশ্লেষণাত্মক সমাধান" একটাই।
ড্যারেন হিক্স

7
আসকটম নিবন্ধটিতে একটি অপ্টিমাইজারের ইঙ্গিত রয়েছে যা SELECT / * + FIRST_ROWS (n) / a ব্যবহার করে। , rownum rnum সমাপ্তি স্ল্যাশটি একটি তারকাচিহ্নের আগে হওয়া উচিত। এসও এটি স্ক্রাব করছে।
ডেভিড মান

1
নোট করুন যে ওরাকল 11 এর জন্য ROWNUM এর সাথে একটি বহিরাগত নির্বাচন আপনাকে একটি আপডেটযোগ্য রেজাল্টসেটে (ওআরএ-01446 সহ) ডিলিট রকে কল করতে বাধা দেবে - সেই 12 সি আর 1 পরিবর্তনের প্রত্যাশায়!
nsandersen

185

নিম্নলিখিত পদ্ধতির জন্য আমি কিছু কর্মক্ষমতা পরীক্ষা করেছি:

Asktom

select * from (
  select a.*, ROWNUM rnum from (
    <select statement with order by clause>
  ) a where rownum <= MAX_ROW
) where rnum >= MIN_ROW

বিশ্লেষণাত্মক

select * from (
  <select statement with order by clause>
) where myrow between MIN_ROW and MAX_ROW

সংক্ষিপ্ত বিকল্প

select * from (
  select statement, rownum as RN with order by clause
) where a.rn >= MIN_ROW and a.rn <= MAX_ROW

ফলাফল

সারণীতে 10 মিলিয়ন রেকর্ড রয়েছে, সাজানো ছিল আন-ইনডেক্সড ডেটটাইম সারিতে:

  • তিনটি নির্বাচনের জন্য পরিকল্পনার সমান মান দেখানো হয়েছে (323168)
  • তবে বিজয়ী হলেন আস্কটম (বিশ্লেষণাত্মক অনুসারে পিছনে)

প্রথম 10 টি সারি নির্বাচন করা গ্রহণ করেছে:

  • আস্কটম: ২৮-৩০ সেকেন্ড
  • বিশ্লেষণাত্মক: 33-37 সেকেন্ড
  • সংক্ষিপ্ত বিকল্প: 110-140 সেকেন্ড

100,000 এবং 100,010 এর মধ্যে সারি নির্বাচন করা:

  • AskTom: 60 সেকেন্ড
  • বিশ্লেষণাত্মক: 100 সেকেন্ড

9,000,000 এবং 9,000,010 এর মধ্যে সারি নির্বাচন করা:

  • আসকটম: ১৩০ সেকেন্ড
  • বিশ্লেষণাত্মক: 150 সেকেন্ড

চমৎকার কাজ. আপনি কি> = এবং <= এর পরিবর্তে একটি সংক্ষিপ্ত বিকল্পের চেষ্টা করেছিলেন?
ম্যাথিউ লংটিন

4
@MathieuLongtin BETWEENজন্য শুধু একটি সাঁটে লেখার হয় >= AND <=( stackoverflow.com/questions/4809083/between-clause-versus-and )
wweicker

1
জেলডি - এটি কোন সংস্করণে ছিল? ওরাকল 11.1.1 এ বিশ্লেষণমূলক কর্মক্ষমতা উন্নতি করেছে। এবং 11.2।
লেইফ রিফেল

@ লাইফ রিফেল এটি ছিল 10.2.0.5; একদিন আমি সময় নিতে পারি এবং 11i সংস্করণটিও পরীক্ষা করতে পারি।
zeldi

5
আমি কিছু দ্রুত পরীক্ষা চালিয়েছি এবং 12 সি এর জন্য একই রকম ফলাফল পেয়েছি। নতুন offsetসিনট্যাক্সটির বিশ্লেষণী পদ্ধতির মতো একই পরিকল্পনা এবং কার্য সম্পাদন রয়েছে।
জন হেলার

55

শুধুমাত্র একটি নেস্টেড ক্যোয়ারী সহ একটি বিশ্লেষণাত্মক সমাধান:

SELECT * FROM
(
   SELECT t.*, Row_Number() OVER (ORDER BY name) MyRow FROM sometable t
) 
WHERE MyRow BETWEEN 10 AND 20;

Rank()জন্য প্রতিস্থাপিত হতে পারে Row_Number()তবে নামের জন্য নকল মান আছে কিনা আপনি প্রত্যাশা চেয়ে আরো রেকর্ড ফিরে আসতে পারে।


3
আমি বিশ্লেষণ পছন্দ করি। র‌্যাঙ্ক () এবং রো_ নাম্বার () এর মধ্যে আচরণের পার্থক্য কী হবে তা আপনি স্পষ্ট করতে চাইতে পারেন।
ডেভ কোস্টা

প্রকৃতপক্ষে, নিশ্চিত নই কেন আমি নকল সম্পর্কে ভাবি নি। সুতরাং, এই ক্ষেত্রে যদি নামের জন্য সদৃশ মান থাকে তবে RANK আপনার প্রত্যাশার চেয়ে আরও বেশি রেকর্ড দিতে পারে তাই আপনার Row_Number ব্যবহার করা উচিত।
লেইফ রিফেল

যদি rank()এটি উল্লেখ করা হয় তবে এটিও লক্ষণীয় dense_rank()যে এটি আউটপুট নিয়ন্ত্রণের জন্য আরও কার্যকর হতে পারে কারণ পরবর্তী সংখ্যাগুলি "এড়িয়ে যায়" না, তবে rank()পারে। এই প্রশ্নের জন্য যে কোনও ক্ষেত্রে row_number()সেরা উপযুক্ত। অন্য একটি নয়, এই কৌশলটি কোনও ডিবিতে প্রযোজ্য যা উল্লিখিত ফাংশনগুলিকে সমর্থন করে।
ব্যবহৃত_বাই_আলডিয়ার

28

ওরাকল 12 সি তে ( এসকিউএল রেফারেন্সে সারি সীমাবদ্ধকরণ শৃঙ্খলা দেখুন ):

SELECT * 
FROM sometable
ORDER BY name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;

53
এবং অবশ্যই, তাদের এখন পর্যন্ত সবার তুলনায় একেবারে আলাদা সিনট্যাক্স ব্যবহার করতে হয়েছিল
ম্যাথিউ লংটিন

9
স্পষ্টতই LIMITএসকিউএল: ২০০৮ এ সম্মত হওয়ার জন্য অন্য সমস্ত বিক্রেতাদের সাথে বসে থাকার পরে তাদের মাইক্রোসফ্টের বই থেকে একটি পাতা বের করে মানটি ভঙ্গ করতে হয়েছিল।
বেলডাজ

1
আকর্ষণীয়ভাবে আমি সম্প্রতি শুনেছি যে অতি সাম্প্রতিক স্ট্যান্ডার্ডটিতে এই বাক্য গঠনটি অন্তর্ভুক্ত রয়েছে, তাই সম্ভবত ওরাকল এটি প্রয়োগের আগে প্রথমে এটি ঠেলে দিয়েছিল। LIMIT ... OFFSET
তাত্ক্ষণিকভাবে

3
@ ডেরেক: হ্যাঁ, মান অনুসরণ না করা দুঃখজনক। তবে 12 সিআর 1 এ সদ্য চালু হওয়া কার্যকারিতা কেবলমাত্র LIMIT n, m(আমার উত্তর দেখুন) চেয়ে বেশি শক্তিশালী । আবার, ওরাকলকে LIMIT n, mসিন্ট্যাকটিক চিনির হিসাবে কার্যকর করা উচিত ছিল , কারণ এটি সমতুল্য OFFSET n ROWS FETCH NEXT m ROWS ONLY
সংপাথ্রিস

10
@Derek: বাস্তবিক, আমি শুধু পোস্টগ্রি ম্যানুয়াল এই মন্তব্য খেয়াল postgresql.org/docs/9.0/static/sql-select.html#AEN69535 ক্লজ সীমাবদ্ধ করে "এবং অফসেট পোস্টগ্রি-নির্দিষ্ট সিনট্যাক্স, এছাড়াও মাইএসকিউএল দ্বারা ব্যবহার করা হয় SQL এর। : ২০০৮ স্ট্যান্ডার্ড অফসেটস চালু করেছে ... একই কার্যকারিতাটির জন্য "ফ্যাক্ট {প্রথম | নেক্সট} ..." সুতরাং LIMIT কখনও কখনও স্ট্যান্ডার্ডের অংশ ছিল না।
বেলডাজ

14

অর্ডার সহ পৃষ্ঠাগুলি অনুসন্ধানগুলি ওরাকলে সত্যই জটিল।

ওরাকল একটি ROWNUM সিউডোকলনম সরবরাহ করে যা একটি নম্বর প্রদান করে যাতে নির্দেশ করে যে ডাটাবেসটি একটি সারণী বা যোগদানের দৃশ্যের সেট থেকে সারিটি নির্বাচন করে।

ROWNUM এমন একটি সিউডোকলোনম যা বহু লোককে সমস্যায় ফেলে। একটি ROWNUM মান স্থায়ীভাবে একটি সারিতে নির্ধারিত হয় না (এটি একটি সাধারণ ভুল বোঝাবুঝি। যখন কোনও ROWNUM মানটি বরাদ্দ করা হয় তখন এটি বিভ্রান্তিকর হতে পারে। ক্যোয়ারের ফিল্টার পূর্বাভাসগুলি ছাড়াই তবে ক্যোয়ারীর সমষ্টি বা বাছাইয়ের আগে একটি ROWNUM মান একটি সারিতে নির্ধারিত হয় ।

আরও কী, একটি ROWNUM মান বরাদ্দ করা হয় তবেই এটি নির্ধারিত হয়।

এই কারণেই অনুসরণীয় ক্যোয়ারী কোনও সারি দেয় না:

 select * 
 from (select *
       from some_table
       order by some_column)
 where ROWNUM <= 4 and ROWNUM > 1; 

ক্যোয়ারির ফলাফলের প্রথম সারিতে ROWNUM> 1 প্রিকিকেট পাস হয় না, সুতরাং ROWNUM 2 বৃদ্ধি হয় না reason এই কারণে, কোনও ROWNUM মান 1 এর চেয়ে বেশি হয় না, ফলস্বরূপ, কোয়েরিতে কোনও সারি দেয় না।

সঠিকভাবে সংজ্ঞায়িত ক্যোয়ারির মতো দেখতে হবে:

select *
from (select *, ROWNUM rnum
      from (select *
            from skijump_results
            order by points)
      where ROWNUM <= 4)
where rnum > 1; 

ভার্টাবেলোতে আমার নিবন্ধগুলিতে পৃষ্ঠা সংক্রান্ত প্রশ্নাগুলি সম্পর্কে আরও সন্ধান করুন ব্লগে করুন:


2
ক্যোয়ারী ফলাফলের প্রথম সারিতে ROWNUM> 1 প্রিকিকেট (…) পাস হয় না - এটি ব্যাখ্যা করার জন্য আপভোট।
পাইওটার ডব্রোগোস্ট

6

এসকিউএল স্ট্যান্ডার্ড

যেমনটি আমি এই নিবন্ধে ব্যাখ্যা করেছি , এসকিউএল: ২০০৮ স্ট্যান্ডার্ড এসকিউএল ফলাফল সেটটিকে সীমাবদ্ধ করতে নিম্নলিখিত সিনট্যাক্স সরবরাহ করে:

SELECT
    title
FROM
    post
ORDER BY
    id DESC
FETCH FIRST 50 ROWS ONLY

ওরাকল 11 গ্রাম এবং পুরানো সংস্করণ

সংস্করণ 12 সি এর আগে, টপ-এন রেকর্ডগুলি আনার জন্য আপনাকে একটি উত্সযুক্ত টেবিল এবং ROWNUM সিউডোকলোনাম ব্যবহার করতে হবে:

SELECT *
FROM (
    SELECT
        title
    FROM
        post
    ORDER BY
        id DESC
)
WHERE ROWNUM <= 50

5

কম নির্বাচন করুন স্টেটমেন্ট। এছাড়াও, কম কর্মক্ষমতা গ্রাস। ক্রেডিট এ: anibal@upf.br

SELECT *
    FROM   (SELECT t.*,
                   rownum AS rn
            FROM   shhospede t) a
    WHERE  a.rn >= in_first
    AND    a.rn <= in_first;

2
তদতিরিক্ত, এটি সম্পূর্ণরূপে ভুল উত্তর। বাছাইয়ের পরে প্রশ্ন সীমাবদ্ধ করা সম্পর্কে ছিল। সুতরাং রোউনাম subquery বাইরে থাকা উচিত।
বিটলর্ড

5

গৃহীত উত্তরের একটি এক্সটেনশন হিসাবে ওরাকল অভ্যন্তরীণভাবে ROW_NUMBER/RANKফাংশন ব্যবহার করে। OFFSET FETCHসিনট্যাক্স একটি সিনট্যাক্স চিনি।

DBMS_UTILITY.EXPAND_SQL_TEXTপদ্ধতি ব্যবহার করে এটি লক্ষ্য করা যায় :

নমুনা প্রস্তুত:

CREATE TABLE rownum_order_test (
  val  NUMBER
);

INSERT ALL
  INTO rownum_order_test
SELECT level
FROM   dual
CONNECT BY level <= 10;
COMMIT;

প্রশ্ন:

SELECT val
FROM   rownum_order_test
ORDER BY val DESC
FETCH FIRST 5 ROWS ONLY;

নিয়মিত:

SELECT "A1"."VAL" "VAL" 
FROM  (SELECT "A2"."VAL" "VAL","A2"."VAL" "rowlimit_$_0",
               ROW_NUMBER() OVER ( ORDER BY "A2"."VAL" DESC ) "rowlimit_$$_rownumber" 
      FROM "ROWNUM_ORDER_TEST" "A2") "A1" 
WHERE "A1"."rowlimit_$$_rownumber"<=5 ORDER BY "A1"."rowlimit_$_0" DESC;

ডিবি <> ফিডাল ডেমো

প্রসারিত এসকিউএল পাঠ্য আনছে:

declare
  x VARCHAR2(1000);
begin
 dbms_utility.expand_sql_text(
        input_sql_text => '
          SELECT val
          FROM   rownum_order_test
          ORDER BY val DESC
          FETCH FIRST 5 ROWS ONLY',
        output_sql_text => x);

  dbms_output.put_line(x);
end;
/

WITH TIESহিসাবে প্রসারিত হয় RANK:

declare
  x VARCHAR2(1000);
begin
 dbms_utility.expand_sql_text(
        input_sql_text => '
          SELECT val
          FROM   rownum_order_test
          ORDER BY val DESC
          FETCH FIRST 5 ROWS WITH TIES',
        output_sql_text => x);

  dbms_output.put_line(x);
end;
/

SELECT "A1"."VAL" "VAL" 
FROM  (SELECT "A2"."VAL" "VAL","A2"."VAL" "rowlimit_$_0",
              RANK() OVER ( ORDER BY "A2"."VAL" DESC ) "rowlimit_$$_rank" 
       FROM "ROWNUM_ORDER_TEST" "A2") "A1" 
WHERE "A1"."rowlimit_$$_rank"<=5 ORDER BY "A1"."rowlimit_$_0" DESC

এবং অফসেট:

declare
  x VARCHAR2(1000);
begin
 dbms_utility.expand_sql_text(
        input_sql_text => '
          SELECT val
FROM   rownum_order_test
ORDER BY val
OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY',
        output_sql_text => x);

  dbms_output.put_line(x);
end;
/


SELECT "A1"."VAL" "VAL" 
FROM  (SELECT "A2"."VAL" "VAL","A2"."VAL" "rowlimit_$_0",
             ROW_NUMBER() OVER ( ORDER BY "A2"."VAL") "rowlimit_$$_rownumber" 
       FROM "ROWNUM_ORDER_TEST" "A2") "A1" 
       WHERE "A1"."rowlimit_$$_rownumber"<=CASE  WHEN (4>=0) THEN FLOOR(TO_NUMBER(4)) 
             ELSE 0 END +4 AND "A1"."rowlimit_$$_rownumber">4 
ORDER BY "A1"."rowlimit_$_0"

3

যদি আপনি ওরাকল 12 সি তে না থাকেন তবে আপনি নীচের মত শীর্ষ এন ক্যোরি ব্যবহার করতে পারেন।

SELECT *
 FROM
   ( SELECT rownum rnum
          , a.*
       FROM sometable a 
   ORDER BY name
   )
WHERE rnum BETWEEN 10 AND 20;

আপনি এটিকেও নীচের মতো ধারা দিয়ে ক্লজ থেকে সরিয়ে নিতে পারেন

WITH b AS
( SELECT rownum rnum
      , a.* 
   FROM sometable a ORDER BY name
) 
SELECT * FROM b 
WHERE rnum BETWEEN 10 AND 20;

এখানে আসলে আমরা একটি ইনলাইন ভিউ তৈরি করছি এবং রনউমকে rnum নামকরণ করছি। আপনি ফিল্টার মানদণ্ড হিসাবে প্রধান ক্যোয়ারিতে rnum ব্যবহার করতে পারেন।


1
আমার ক্ষেত্রে এটি সঠিক সারিগুলি ফেরেনি। আমি কি এটা ঠিক করার করেনি করতে হয় ORDER BYএবং rownumআলাদাভাবে। মূলত আমি একটি সাব-কোয়েরি তৈরি করেছি যার ORDER BYক্লজ ছিল
প্যাট্রিক গ্রেগরিও

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

@ পাইওটারডব্রোগস্ট রোউনাম কেবল বাইরে রয়েছে।
সান্দি

2

আমি ওরাকল 1z0-047 পরীক্ষার জন্য প্রস্তুতি শুরু করেছি, 12c এর সাথে বৈধতা পেয়েছি এর জন্য প্রস্তুতি নেওয়ার সময় আমি 'FETCH FIRST' নামে পরিচিত একটি 12 সি বর্ধন পেরিয়ে এসেছি এটি আপনাকে আপনার সুবিধাগুলি অনুসারে সারি / সীমা সারি আনতে সক্ষম করে। এটির সাথে বেশ কয়েকটি বিকল্প উপলব্ধ

- FETCH FIRST n ROWS ONLY
 - OFFSET n ROWS FETCH NEXT N1 ROWS ONLY // leave the n rows and display next N1 rows
 - n % rows via FETCH FIRST N PERCENT ROWS ONLY

উদাহরণ:

Select * from XYZ a
order by a.pqr
FETCH FIRST 10 ROWS ONLY

3
stackoverflow.com/a/26051830/635608 - এটি ইতিমধ্যে অন্যান্য উত্তরে সরবরাহ করা হয়েছে। ইতিমধ্যে কয়েক মাস আগে পোস্ট করা স্টাফ পোস্ট করা থেকে বিরত থাকুন।
মাদুর

1
ওহ অবশ্যই, প্রতিটি উত্তর দিয়ে যায় নি, আমি প্রথমদিকে সাব-কোয়েরিগুলি জুড়ে এসেছি, এটি মনে রাখবেন।
অর্জুন গৌড়

1
select * FROM (SELECT 
   ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID, 
 FROM EMP ) EMP  where ROWID=5

বৃহত্তর তারপর মান খুঁজে

select * FROM (SELECT 
       ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID, 
     FROM EMP ) EMP  where ROWID>5

কম তারপর মান খুঁজে

select * FROM (SELECT 
       ROW_NUMBER() OVER (ORDER BY sal desc),* AS ROWID, 
     FROM EMP ) EMP  where ROWID=5

ROW_NUMBER()ভিত্তিক সমাধান হিসাবে ডাউনভোট ইতিমধ্যে লে রিফেল পোস্ট করেছিলেন। আসক্তিতে কোডটিতে সিনট্যাক্স ত্রুটি রয়েছে।
পাইওটর ডব্রোগোস্ট

1

প্রতিটি ক্যোয়ারিতে ফিরে আসা প্রতিটি সারিটির জন্য, ROWNUM সিউডোকলোনাম একটি নম্বর প্রদান করে যাতে ক্রমটি নির্দেশ করে যাতে ওরাকল একটি সারণী বা যোগদানকৃত সারিগুলির সেট থেকে সারিটি নির্বাচন করে। নির্বাচিত প্রথম সারিতে 1 এর ROWNUM রয়েছে, দ্বিতীয়টিতে 2 টি রয়েছে এবং আরও কিছু রয়েছে।

  SELECT * FROM sometable1 so
    WHERE so.id IN (
    SELECT so2.id from sometable2 so2
    WHERE ROWNUM <=5
    )
    AND ORDER BY so.somefield AND ROWNUM <= 100 

আমি এটি oracleসার্ভারে প্রয়োগ করেছি11.2.0.1.0


প্রশ্নটি অর্ডার করা সারিগুলি সীমাবদ্ধ করার বিষয়ে জিজ্ঞাসা করে এবং আপনার এমনকি
অর্ডারও নেই

@ পাইওটারডব্রোগোস্ট বুঝতে পারেন যে কোনও বিশাল কাজ নয়, ক্রমানুসারে কীওয়ার্ডগুলি সমস্ত rdbms এর জন্য সাধারণ তবে কেবল সীমা পরিবর্তন হয়।
সুমেশ টিজি

-1

এসকিউএল-বিকাশকারীদের ক্ষেত্রে এটি স্বয়ংক্রিয়ভাবে কেবল প্রথম 50 টি সারি নিয়ে আসে। এবং যদি আমরা নীচে স্ক্রোল করি তবে এটি আরও 50 টি সারি আনে এবং আরও!

সুতরাং স্কেল-বিকাশকারী সরঞ্জামের ক্ষেত্রে আমাদের সংজ্ঞা দেওয়ার দরকার নেই!


-3

ওরাকলে

SELECT val FROM   rownum_order_test ORDER BY val DESC FETCH FIRST 5 ROWS ONLY;

Val

    10
    10
     9
     9
     8

5 টি সারি নির্বাচন করা হয়েছে।

এসকিউএল>


7
আপনার নির্দিষ্ট করা উচিত যে এটি ওরাকল 12 সি থেকে শুরু হয়ে প্রযোজ্য এবং আপনি কোথাও থেকে এটি অনুলিপি / পেস্ট করেছেন - দয়া করে সর্বদা আপনার উত্সগুলি উদ্ধৃত করুন।
মাদুর

উত্সটি হ'ল এটি @ ম্যাট। এবং রাকেশ, দয়া করে কমপক্ষে মূল প্রশ্নের উত্তরটি মানিয়ে নেওয়ার চেষ্টা করুন। আমি একই উত্সটি উদ্ধৃত করে একটি উত্তরও সরবরাহ করেছি, তবে আমি বিস্তৃত হওয়ার চেষ্টা করেছি এবং মূল উত্সটি উদ্ধৃত করেছি।
সংপাথ্রিসিস

-4

(স্বাক্ষরিত) এর মতো কিছু কাজ করতে পারে

WITH
base AS
(
    select *                   -- get the table
    from sometable
    order by name              -- in the desired order
),
twenty AS
(
    select *                   -- get the first 30 rows
    from base
    where rownum < 30
    order by name              -- in the desired order
)
select *                       -- then get rows 21 .. 30
from twenty
where rownum > 20
order by name                  -- in the desired order

এছাড়াও বিশ্লেষণমূলক ফাংশন র‌্যাঙ্ক রয়েছে, যা আপনি অর্ডার করতে ব্যবহার করতে পারেন।


2
এটি একটি একক সারি ফেরত দেবে না কারণ ফলাফলের উপর ROWNUM একটি কলাম তাই শেষের শর্তটি সর্বদা মিথ্যা হবে। এছাড়াও আপনি গ্যারান্টি অর্ডার দ্বারা রাউনম এবং একটি অর্ডার ব্যবহার করতে পারবেন না।
বেন

2
চমৎকার। অন্যদের জন্য একটি সতর্কতা হিসাবে এটি এখানে ছেড়ে দিন।
এভিলটিচ

-5

সংশোধন সহ উপরে হিসাবে একই। কাজ করে তবে অবশ্যই সুন্দর নয়।

   WITH
    base AS
    (
        select *                   -- get the table
        from sometable
        order by name              -- in the desired order
    ),
    twenty AS
    (
        select *                   -- get the first 30 rows
        from base
        where rownum <= 30
        order by name              -- in the desired order
    )
    select *                       -- then get rows 21 .. 30
    from twenty
    where rownum < 20
    order by name                  -- in the desired order

সত্য, উপরের উত্তরগুলি ব্যবহার করা ভাল।


5
অর্ডার বাইয়ের আগে WHERE ধারাটি মূল্যায়ন করা হওয়ায় এটি ভুল।
বেন

3
আকর্ষণীয়ভাবে নীচে আমার খারাপ উত্তর থেকে চুরি।
এভিলটাইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.