ऑर्डर करने के बाद ओरेकल क्वेरी द्वारा दी गई पंक्तियों की संख्या को कैसे सीमित करूं?


1031

क्या कोई Oracleक्वेरी बनाने का एक तरीका है जैसे कि इसमें एक MySQL limitखंड है?

में MySQL, मैं यह कर सकता हूँ:

select * 
from sometable
order by name
limit 20,10

21 वीं से 30 वीं पंक्तियों को पाने के लिए (पहले 20 को छोड़ें, अगले 10 को दें)। पंक्तियों को इसके बाद चुना जाता है order by, इसलिए यह वास्तव में 20 वें नाम पर वर्णानुक्रम में शुरू होता है।

में Oracle, केवल एक चीज लोगों का उल्लेख है rownumछद्म स्तंभ है, लेकिन यह मूल्यांकन किया जाता है से पहले order by , इसका मतलब है जो:

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

नाम से आदेशित दस पंक्तियों का एक यादृच्छिक सेट लौटाएगा, जो आमतौर पर मैं नहीं चाहता। यह भी एक ऑफसेट निर्दिष्ट करने के लिए अनुमति नहीं है।


16
SQL में मानकीकृत: 2008।
dalle

14
ओरेकल 12 सी के लिए टॉम
कायटे

14
परिणाम सेट में अगला पृष्ठ ला रहा है?
मैथ्यू लॉन्गटिन

3
@YaroslavShabalin विशेष रूप से, एक पृष्ठांकित खोज हर समय इस पैटर्न का उपयोग करती है। किसी भी तरह के सर्च फंक्शन वाला लगभग कोई भी ऐप इसका इस्तेमाल करने वाला है। एक अन्य उपयोग मामला एक लंबी सूची या तालिका क्लाइंट पक्ष का केवल एक हिस्सा लोड हो रहा होगा और उपयोगकर्ता को विस्तार करने का विकल्प देगा।
jpmc26

3
@YaroslavShabalin जब तक अंतर्निहित डेटा नहीं बदलता है तब तक आप एक अलग परिणाम सेट प्राप्त नहीं कर सकते ORDER BY। यह आदेश देने का पहला बिंदु है। यदि अंतर्निहित डेटा में परिवर्तन होता है और आपका परिणाम इसके कारण बदलता है, तो उपयोगकर्ता को पुरानी जानकारी के बजाय अपडेट किए गए परिणाम क्यों नहीं दिखाए जाते हैं? इसके अलावा, राज्य प्रबंधन एक प्लेग है जिससे जितना संभव हो उतना बचा जाना चाहिए। यह जटिलता और बग का एक निरंतर स्रोत है; यही कारण है कि कार्यात्मक इतना लोकप्रिय हो रहा है। और आप मेमोरी में सेट किए गए पूरे परिणाम को समाप्त करने के लिए कब जानेंगे? वेब में, आपके पास यह जानने का कोई तरीका नहीं है कि उपयोगकर्ता कब निकलता है।
jpmc26

जवाबों:


619

ओरेकल 12C आर 1 (12.1) से शुरू, वहाँ है एक पंक्ति खंड सीमित । यह परिचित LIMITवाक्यविन्यास का उपयोग नहीं करता है , लेकिन यह अधिक विकल्पों के साथ काम को बेहतर ढंग से कर सकता है। आप यहाँ पूर्ण सिंटैक्स पा सकते हैं । ( इस उत्तर में ओरेकल में आंतरिक रूप से यह कैसे काम करता है, इस पर अधिक पढ़ें )।

मूल प्रश्न का उत्तर देने के लिए, यहाँ प्रश्न है:

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

(पूर्ववर्ती Oracle संस्करणों के लिए, कृपया इस प्रश्न के अन्य उत्तरों को देखें)


उदाहरण:

लिंक रोट को रोकने की उम्मीद में, लिंक किए गए पृष्ठ से निम्नलिखित उदाहरण उद्धृत किए गए थे ।

सेट अप

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;

अधिक जानकारी के लिए Oracle / AskTom पर परिणाम डाउनलोड और सीमित करने के विषय पर भी एक नज़र डालें ।

अद्यतन : परिणाम को कम और ऊपरी सीमा दोनों के साथ सीमित करने के लिए चीजें थोड़ी अधिक फूली हुई हैं

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;

(निर्दिष्ट AskTom- लेख से नकल)

अद्यतन 2 : Oracle 12c (12.1) से शुरू होकर पंक्तियों को सीमित करने या ऑफ़सेट पर शुरू करने के लिए एक सिंटैक्स उपलब्ध है।

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

अधिक उदाहरणों के लिए इस उत्तर को देखें । संकेत के लिए क्रुमिया को धन्यवाद।


5
यह निश्चित रूप से ऐसा करने का तरीका है, लेकिन जागरूक रहें (जैसा कि पूछें टॉम लेख कहता है) क्वेरी का प्रदर्शन बढ़ जाता है क्योंकि आपका अधिकतम रोटरम बढ़ता है। यह क्वेरी परिणामों के लिए एक अच्छा समाधान है, जहाँ आप केवल पहले कुछ पृष्ठ देखना चाहते हैं, लेकिन यदि आप इसे एक कोड के रूप में एक पूरे पृष्ठ के माध्यम से कोड के लिए एक तंत्र के रूप में उपयोग कर रहे हैं, तो आप अपने कोड को फिर से भरना बेहतर होगा
क्रिस गिल

1
+1 आपके निचले / ऊपरी संस्करण ने वास्तव में मुझे एक ऐसे मुद्दे के चारों ओर काम करने में मदद की, जहां एक मात्र ऊपरी-पंक्तिबद्ध पंक्तिबद्ध खण्ड मेरी क्वेरी को काफी धीमा कर रहा था।
केल्विन

1
Leigh Riffel "केवल एक नेस्टेड क्वेरी के साथ विश्लेषणात्मक समाधान" एक है।
डैरेन हिक्स

7
AskTom लेख में एक ऑप्टिमाइज़र संकेत है जो SELECT / * + FIRST_ROWS (n) / a का उपयोग करता है। , rownum rnum समापन स्लैश तारांकन से पहले होना चाहिए। एसओ इसकी छानबीन कर रहे हैं।
डेविड मैन

1
ध्यान दें कि ओरेकल 11 के लिए ROWNUM के साथ एक बाहरी चयन आपको एक अद्यतन करने योग्यResultSet (ORA-01446 के साथ) पर deleteRow को कॉल करने से रोकेगा - उस 12c R1 परिवर्तन के लिए तत्पर!
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 मिलियन रिकॉर्ड थे, सॉर्ट एक unindexed डेटाइम पंक्ति पर था:

  • बताएं कि सभी तीन चयनों (323168) के लिए योजना का मूल्य समान है
  • लेकिन विजेता AskTom है (विश्लेषणात्मक पीछे के करीब के साथ)

पहले 10 पंक्तियों का चयन किया:

  • AskTom: 28-30 सेकंड
  • विश्लेषणात्मक: 33-37 सेकंड
  • लघु विकल्प: 110-140 सेकंड

100,000 और 100,010 के बीच पंक्तियों का चयन:

  • AskTom: 60 सेकंड
  • विश्लेषणात्मक: 100 सेकंड

9,000,000 और 9,000,010 के बीच पंक्तियों का चयन:

  • AskTom: 130 सेकंड
  • विश्लेषणात्मक: 150 सेकंड

अच्छा काम। क्या आपने> = और <= के बजाय बीच के छोटे विकल्प का प्रयास किया?
मथिउ लॉन्ग्टिन

4
@MathieuLongtin BETWEENके लिए सिर्फ एक आशुलिपि है >= AND <=( stackoverflow.com/questions/4809083/between-clause-versus-and )
wweicker

1
zeldi - यह किस संस्करण पर था? Oracle ने 11.1 में विश्लेषणात्मक प्रदर्शन में सुधार किया है। और 11.2।
लेह रिफ़ेल

@ ली रिफ़ेल यह 10.2.0.5 था; एक दिन मैं समय निकाल सकता हूं और 11i संस्करण भी देख सकता हूं।
झेल्दी

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
मुझे एनालिटिक्स बहुत पसंद है। आप यह स्पष्ट करना चाह सकते हैं कि रैंक () और Row_Number () के बीच व्यवहार में क्या अंतर होगा।
डेव कोस्टा

वास्तव में, मुझे यकीन नहीं है कि मैंने डुप्लिकेट के बारे में क्यों नहीं सोचा। तो, इस मामले में यदि नाम के लिए डुप्लिकेट मान हैं, तो RANK आपसे अधिक रिकॉर्ड दे सकता है, जिसकी आप अपेक्षा कर रहे हैं इसलिए आपको Row_Number का उपयोग करना चाहिए।
लेह रिफ़ेल

यदि rank()इसका उल्लेख करना भी ध्यान देने योग्य है dense_rank()जो आउटपुट नियंत्रण के लिए अधिक उपयोगी हो सकता है क्योंकि बाद वाला नंबर "स्किप" नहीं करता है, जबकि rank()कर सकते हैं। किसी भी मामले में इस सवाल के row_number()लिए सबसे उपयुक्त है। एक और नहीं यह तकनीक किसी भी डीबी पर लागू होती है जो उल्लिखित कार्यों का समर्थन करती है।
प्रयुक्त_By_Already

28

Oracle 12c पर ( SQL संदर्भ में पंक्ति सीमित खंड देखें ):

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

53
और हां, उन्हें अब तक हर किसी की तुलना में पूरी तरह से अलग वाक्यविन्यास का उपयोग करना था
मैथ्यू लॉन्गटिन

9
LIMITSQL: 2008 में सहमत होने के लिए अन्य सभी विक्रेताओं के साथ बैठने के बाद स्पष्ट रूप से उन्हें Microsoft की पुस्तक से एक पत्ता निकालना और मानक को तोड़ना पड़ा।
बेलाज

1
दिलचस्प बात यह है कि मैंने हाल ही में सुना है कि सबसे हालिया मानक में इस सिंटैक्स शामिल है, इसलिए शायद ओरेकल ने इसे लागू करने से पहले पहले धकेल दिया। LIMIT ... OFFSET
तर्क

3
@ डेरेक: हां, मानक का पालन नहीं करना अफसोसजनक है। लेकिन 12cR1 में नई पेश की गई कार्यक्षमता सिर्फ LIMIT n, m(मेरे जवाब देखें) की तुलना में अधिक शक्तिशाली है । फिर, ओरेकल LIMIT n, mको सिंटैक्टिक शुगर के रूप में लागू किया जाना चाहिए , क्योंकि यह इसके बराबर है OFFSET n ROWS FETCH NEXT m ROWS ONLY
संपतस्री

10
@Derek: असल में, मैं सिर्फ PostgreSQL के मैनुअल में इस टिप्पणी पर ध्यान postgresql.org/docs/9.0/static/sql-select.html#AEN69535 खंड सीमा "और ऑफसेट PostgreSQL विशेष वाक्य रचना, भी MySQL द्वारा उपयोग किया जाता एसक्यूएल। : 2008 मानक ने खंड OFFSET ... FETCH {FIRST | NEXT} ... को एक ही कार्यक्षमता के लिए पेश किया है। इसलिए लिमिट कभी भी मानक का हिस्सा नहीं था।
बेलाज

14

ऑर्डर देने के साथ पेजेशन क्वेश्चन ऑरेकल में वास्तव में मुश्किल हैं।

ओरेकल एक डाउनलोड pseudocolumn प्रदान करता है जो एक संख्या को उस क्रम को इंगित करता है जिसमें डेटाबेस तालिका से पंक्ति का चयन करता है या सम्मिलित विचारों के सेट का चयन करता है।

डाउनलोड एक छद्म चॉकलेट है जो कई लोगों को परेशानी में डाल देता है। एक रुम मूल्य स्थायी रूप से एक पंक्ति को नहीं सौंपा गया है (यह एक सामान्य गलतफहमी है)। जब कोई रुम मूल्य वास्तव में असाइन किया गया है तो यह भ्रामक हो सकता है। क्वेरी के फ़िल्टर विधेयकों को पास करने से पहले, लेकिन क्वेरी एकत्रीकरण या छँटाई से पहले एक डाउनलोड मूल्य एक पंक्ति को दिया जाता है

क्या अधिक है, एक रुमैट मान को असाइन किए जाने के बाद ही बढ़ाया जाता है।

यही कारण है कि followin क्वेरी कोई पंक्तियाँ नहीं लौटाती:

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

क्वेरी परिणाम की पहली पंक्ति ROWNUM> 1 विधेय को पारित नहीं करती है, इसलिए ROWNUM 2 में वृद्धि नहीं करता है। इस कारण से, कोई ROWNUM मान 1 से अधिक नहीं मिलता है, फलस्वरूप, क्वेरी में कोई पंक्तियाँ नहीं होती हैं।

सही ढंग से परिभाषित क्वेरी इस तरह दिखनी चाहिए:

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

वर्टेबेलो ब्लॉग पर मेरे लेखों में पृष्ठांकन प्रश्नों के बारे में अधिक जानें :


2
क्वेरी परिणाम की पहली पंक्ति ROWNUM> 1 विधेय (…) को पारित नहीं करती है - इसे समझाने के लिए upvote।
पायोत्र डोब्रोगोस्ट

6

SQL मानक

जैसा कि मैंने इस लेख में बताया , SQL: 2008 मानक SQL परिणाम सेट को सीमित करने के लिए निम्न सिंटैक्स प्रदान करता है:

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

Oracle 11g और पुराने संस्करण

टॉप-एन रिकॉर्ड लाने के लिए, संस्करण 12 सी से पहले, आपको एक व्युत्पन्न तालिका और रुम प्यूज़ोकोल चॉकलेट का उपयोग करना होगा:

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
इसके अलावा, यह पूरी तरह से गलत जवाब है। प्रश्न छँटाई के बाद AFTER को सीमित करने के बारे में था। इसलिए उप-भाग उपमहाद्वीप से बाहर होना चाहिए।
BitLord

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;

db <> फिडेल डेमो

विस्तारित SQL टेक्स्ट प्राप्त करना:

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

यदि आप Oracle 12C पर नहीं हैं, तो आप नीचे की तरह TOP N क्वेरी का उपयोग कर सकते हैं।

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एक उपश्रेणी के बाहर होना चाहिए।
पायोत्र डोब्रोगोस्ट

@PiotrDobrogost उपद्रवी केवल बाहर है।
रेती

2

मैं Oracle 1z0-047 परीक्षा के लिए तैयारी करने लगा, 12c के खिलाफ मान्य किया गया, जबकि इसके लिए तैयारी करते हुए मुझे एक 12c वृद्धि हुई, जिसे 'FETCH FIRST' के रूप में जाना जाता है। यह आपको अपनी सुविधा के अनुसार पंक्तियों / सीमा पंक्तियों को लाने में सक्षम बनाता है। इसके साथ कई विकल्प उपलब्ध हैं

- 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 - यह पहले से ही अन्य उत्तरों में प्रदान किया गया है। कृपया उस सामान को पोस्ट करने से परहेज करें जो पहले ही महीनों पहले पोस्ट किया जा चुका है।
Mat

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 pseudocolumn एक क्रम देता है जो उस क्रम को दर्शाता है जिसमें Oracle तालिका से पंक्ति का चयन करता है या सम्मिलित पंक्तियों के सेट से होता है। चयनित पहली पंक्ति में 1 का डाउनलोड है, दूसरे में 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


डाउनवोट करें क्योंकि सवाल ऑर्डर की गई पंक्तियों को सीमित करने के बारे में पूछता है और आपके पास ऑर्डर भी नहीं है
पिओर Dobrogost

@PiotrDobrogost को समझें कि यह बहुत बड़ा काम नहीं है, आदेश देना सभी rdbms के लिए सामान्य है केवल सीमा में परिवर्तन होता है।
सुमेश टीजी

-1

SQL-Developer के मामले में, यह स्वचालित रूप से केवल पहली 50 पंक्तियों को प्राप्त करता है। और अगर हम नीचे स्क्रॉल करते हैं, तो यह एक और 50 पंक्तियों और इतने पर प्राप्त करता है!

इसलिए हमें sql-developer टूल के मामले में परिभाषित करने की आवश्यकता नहीं है!


-3

अलंकृत में

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

VAL

    10
    10
     9
     9
     8

5 पंक्तियों का चयन किया।

एसक्यूएल>


7
आपको यह निर्दिष्ट करना चाहिए कि यह Oracle 12c से शुरू होता है, और आप इसे कहीं से कॉपी / पेस्ट करते हैं - कृपया अपने स्रोतों को हमेशा उद्धृत करें।
मैट

स्रोत यह @Mat है। और राकेश, मूल प्रश्न के उत्तर को अनुकूलित करने के लिए कम से कम प्रयास करें। मैंने उसी स्रोत के हवाले से एक उत्तर भी दिया है, लेकिन मैंने व्यापक होने का प्रयास किया और मूल स्रोत का हवाला दिया।
संपतश्री

-4

(untested) ऐसा कुछ काम कर सकता है

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
यह एक भी पंक्ति नहीं लौटेगा क्योंकि डाउनलोड परिणाम पर एक कॉलम है ताकि अंतिम WHERE की स्थिति हमेशा झूठी होगी। इसके अलावा आप एक गारंटी आदेश द्वारा डाउनलोड और आदेश का उपयोग नहीं कर सकते।
बेन

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
यह गलत है क्योंकि ORDER BY के पहले WHERE क्लॉज का मूल्यांकन किया जाता है।
बेन

3
नीचे मेरे बुरे जवाब से दिलचस्प चुराया गया।
EvilTeach
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.