ඇණවුම් කිරීමෙන් පසු ඔරකල් විමසුමකින් ආපසු එන පේළි ගණන සීමා කරන්නේ කෙසේද?


1052

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

පේළි දහයක අහඹු කට්ටලයක් නමින් ඇණවුම් කරනු ඇත, එය සාමාන්‍යයෙන් මට අවශ්‍ය නොවේ. ඕෆ්සෙට් එකක් නියම කිරීමට ද එය ඉඩ නොදේ.


17
SQL: 2008 හි ප්‍රමිතිකරණය.
dalle

14
ටොම් කයිට් විසින් ඔරකල් 12 සී සඳහා සීමාව නිවේදනය කරන ලදි ...
wolφi

14
ප්‍රති page ල කට්ටලයක ඊළඟ පිටුව ලබා ගැනීම?
මැතිව් ලෝන්ග්ටින්

3
AyaroslavShabalin විශේෂයෙන්, පිටු සෙවුමක් සෑම විටම මෙම රටාව භාවිතා කරයි . ඕනෑම ආකාරයක සෙවුම් කාර්යයක් ඇති ඕනෑම යෙදුමක් පාහේ එය භාවිතා කිරීමට යන්නේ ය. තවත් භාවිත අවස්ථාවක් වනුයේ දිගු ලැයිස්තුවක හෝ මේස සේවාදායක පාර්ශවයේ කොටසක් පමණක් පටවා පුළුල් කිරීමට පරිශීලකයාට අවස්ථාව ලබා දීමයි.
jpmc26

3
AyaroslavShabalin නිසා යටි දත්ත වෙනස් නොවන්නේ නම් ඔබට වෙනත් ප්‍රති result ල කට්ටලයක් ලබා ගත නොහැක ORDER BY. පළමුව ඇණවුම් කිරීමේ සම්පූර්ණ කාරණය එයයි. යටින් පවතින දත්ත වෙනස් වී ඔබගේ ප්‍රති result ලය එය නිසා වෙනස් වේ නම්, යල් පැන ගිය තොරතුරු වෙනුවට යාවත්කාලීන කළ ප්‍රති results ල පරිශීලකයාට පෙන්වන්නේ නැත්තේ ඇයි? එසේම, රාජ්‍ය කළමනාකරණය යනු හැකිතාක් වළක්වා ගත යුතු වසංගතයකි. එය සංකූලතා සහ දෝෂ වල නිරන්තර ප්‍රභවයකි; ක්‍රියාකාරීත්වය එතරම් ජනප්‍රිය වන්නේ එබැවිනි. මතකයේ තබා ඇති සම්පූර්ණ ප්‍රති result ලය කල් ඉකුත්වීමට ඔබ දන්නේ කවදාද? වෙබයේ, පරිශීලකයා ඉවත්ව යන විට ඔබට දැන ගැනීමට ක්‍රමයක් නොමැත.
jpmc26

Answers:


645

ඔරකල් 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සින්ටැක්ස් යනු සින්ටැක්ස් සීනි වේ. විස්තර
Lukasz Szozda

1
ඔරකල් 11G හි LIMIT සහ OFFSET ලබා ගන්නේ කෙසේද?
Pra_A

@Pra_A LIMIT/ සඳහා 11G හි ස්වදේශීය සහාය නොමැත OFFSET. ඔබ අනෙක් පිළිතුරු පරික්ෂා කරන්නේ නම්, ඔවුන් සියල්ලන්ටම එක් ආකාරයකින් හෝ වෙනත් ආකාරයකින් ඇත්ත වශයෙන්ම සීමාව සහ ඕෆ්සෙට් ක්‍රියාත්මක කර ඇත.
sampathsris

795

මේ සඳහා ඔබට උපවගන්තියක් භාවිතා කළ හැකිය

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

වැඩි විස්තර සඳහා OOW / AskTom හි ROWNUM සහ ප්‍රති results ල සීමා කිරීම යන මාතෘකාව දෙස බලන්න .

යාවත්කාලීන කිරීම : පහළ සහ ඉහළ සීමාවන් සමඟ ප්‍රති result ලය සීමා කිරීම සඳහා දේවල් තව ටිකක් පුපුරා යයි

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 : ඔරකල් 12 සී (12.1) සිට පේළි සීමා කිරීමට හෝ ඕෆ්සෙට් වලින් ආරම්භ කිරීමට සින්ටැක්ස් තිබේ.

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

තවත් උදාහරණ සඳහා මෙම පිළිතුර බලන්න . ඉඟිය සඳහා කෘමියාට ස්තූතියි.


5
මෙය නියත වශයෙන්ම එය කළ හැකි ක්‍රමයයි, නමුත් දැනුවත්ව සිටින්න (අසන්න ටොම් ලිපිය පවසන පරිදි) ඔබේ උපරිම රවුම වැඩි වන විට විමසුම් කාර්ය සාධනය පිරිහෙයි. විමසුම් ප්‍රති results ල සඳහා මෙය හොඳ විසඳුමක් වන අතර ඔබට අවශ්‍ය වන්නේ මුල් පිටු කිහිපය පමණි, නමුත් ඔබ මෙය මුළු වගුවක් හරහා කේතයට පිටුවක් ලබා ගැනීමේ යාන්ත්‍රණයක් ලෙස භාවිතා කරන්නේ නම් ඔබේ කේතය නැවත ප්‍රතිනිර්මාණය කිරීමට වඩා හොඳ වනු ඇත
ක්‍රිස් ගිල්

1
+1 ඔබගේ පහළ / ඉහළ අනුවාදය ඇත්ත වශයෙන්ම මට ඉහළ මායිම් සහිත රවුනම් වගන්තියක් මගේ විමසුම මන්දගාමී වන ගැටලුවක් සමඟ කටයුතු කිරීමට උපකාරී විය.
කෙල්වින්

1
ලී රිෆල් “එක් කැදැලි විමසුමක් සහිත විශ්ලේෂණ විසඳුම” එකකි.
ඩැරන් හික්ස්

7
AskTom ලිපියේ SELECT / * + FIRST_ROWS (n) / a භාවිතා කරන ප්‍රශස්තිකරණ ඉඟියක් ඇත. , rownum rnum වසා දැමීමේ කප්පාදුවට පෙර තරු ලකුණක් තිබිය යුතුය. SO එය සීරීමට ලක් කරයි.
ඩේවිඩ් මෑන්

1
ඔරකල් 11 සඳහා ROWNUM සමඟ පිටත තේරීමක් මඟින් යාවත්කාලින කළ හැකි ප්‍රති et ල කට්ටලයක් (ORA-01446 සමඟ) මකාදැමීම වළක්වන බව සලකන්න - එම 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 ක් තිබුණි, වර්ග කිරීම අනපේක්ෂිත දිවා කාල පේළියක විය:

  • පැහැදිලි කිරීමේ සැලැස්ම තේරීම් තුනටම සමාන අගයක් පෙන්වයි (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
AthMathieuLongtin BETWEENයනු >= AND <=( stackoverflow.com/questions/4809083/between-clause-versus-and ) සඳහා කෙටි යෙදුමකි
wweicker

1
zeldi - මෙය ක්‍රියාත්මක වූයේ කුමන අනුවාදයද? ඔරකල් 11.1 හි විශ්ලේෂණාත්මක කාර්ය සාධනය වැඩි දියුණු කර ඇත. සහ 11.2.
ලී රිෆල්

E ලී රයිෆල් එය 10.2.0.5; යම් දවසක මට කාලය ගත වන අතර 11i අනුවාදයද පරීක්ෂා කරන්න.
zeldi

5
මම ඉක්මන් පරීක්ෂණ කිහිපයක් පවත්වා 12c සඳහා සමාන ප්‍රති results ල ලබා ගත්තා. නව 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()වඩාත් සුදුසුය. අනෙක් ක්‍රමය නම්, මෙම තාක්ෂණය සඳහන් කර ඇති කාර්යයන් සඳහා සහාය වන ඕනෑම ඩීබී සඳහා අදාළ වේ.
ලද_බයි_අල්ඩි

28

ඔරකල් 12 සී මත ( SQL යොමුවෙහි පේළි සීමා කිරීමේ වගන්තිය බලන්න ):

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

54
ඇත්ත වශයෙන්ම, ඔවුන්ට මේ දක්වා අන් සියල්ලන්ට වඩා සම්පූර්ණයෙන්ම වෙනස් වාක්‍ය
ඛණ්ඩයක් භාවිතා කිරීමට සිදුවිය

9
LIMITSQL: 2008 හි එකඟ වීම සඳහා අනෙක් සියලුම වෙළෙන්දන් සමඟ වාඩි වී සිටීමෙන් පසුව ඔවුන්ට මයික්‍රොසොෆ්ට් පොතේ කොළයක් ගෙන ප්‍රමිතිය බිඳ දැමීමට සිදුවිය.
beldaz

1
නවතම ප්‍රමිතියට මෙම වාක්‍ය ඛණ්ඩය ඇතුළත් බව මෑතකදී මට අසන්නට ලැබුණි, එබැවින් සමහර විට ඔරකල් එය ක්‍රියාත්මක කිරීමට පෙර එය තල්ලු කළේය. විවාදාත්මකව එය වඩා නම්යශීලී වේLIMIT ... OFFSET
beldaz

3
E ඩෙරෙක්: ඔව්, ප්‍රමිතිය අනුගමනය නොකිරීම කනගාටුවට කරුණකි. නමුත් 12cR1 හි අලුතින් හඳුන්වා දුන් ක්‍රියාකාරිත්වය හුදෙක් වඩා බලවත් ය LIMIT n, m(මගේ පිළිතුර බලන්න). ඉන්පසු නැවතත්, ඔරකල් LIMIT n, mසින්ටැක්ටික් සීනි ලෙස ක්‍රියාත්මක කළ යුතුව තිබුණි OFFSET n ROWS FETCH NEXT m ROWS ONLY.
sampathsris

10
@Derek: ඇත්තටම, මම මේ බව සඳහන් වන PostgreSQL අත්පොත දක්නට postgresql.org/docs/9.0/static/sql-select.html#AEN69535 දිවි නැගුම පනතේ ඇති සීමා "සහ PostgreSQL-විශේෂිත රීති භාවිතා ද MySQL භාවිතා වේ OFFSET SQL යන්නත්. : 2008 ප්‍රමිතිය මඟින් OFFSET ... FETCH {FIRST | NEXT} ... එකම ක්‍රියාකාරීත්වය සඳහා වගන්ති හඳුන්වා දී ඇත. එබැවින් LIMIT කිසි විටෙකත් සම්මතයේ කොටසක් නොවීය.
බෙල්ඩාස්

14

ඇණවුම් කිරීම සමඟ පේජින් විමසීම් ඔරකල්හි ඇත්තෙන්ම උපක්‍රමශීලී ය.

ඔරකල් විසින් ROWNUM ව්‍යාජ තීරුවක් සපයන අතර එමඟින් දත්ත සමුදාය වගුවකින් පේළිය තෝරාගත් අනුපිළිවෙල හෝ සම්බන්ධිත දර්ශන සමූහයක් දක්වයි.

ROWNUM යනු බොහෝ මිනිසුන් කරදරයට පත් කරන ව්‍යාජ තීරුවකි. ROWNUM අගයක් පේළියකට ස්ථිරවම පවරා නොමැත (මෙය පොදු වරදවා වටහා ගැනීමකි). ROWNUM අගයක් සැබවින්ම පවරා ඇති විට එය ව්‍යාකූල විය හැකිය. පේළියකට ROWNUM අගයක් පවරනු ලබන්නේ එය විමසුමේ පෙරහන් අනාවැකි පසු කළ නමුත් විමසුම් එකතු කිරීමට හෝ වර්ග කිරීමට පෙරය .

එපමණක්ද නොව, ROWNUM අගය වැඩි කරනු ලබන්නේ එය පවරා දීමෙන් පසුව පමණි.

අනුගාමික විමසුම පේළි කිසිවක් නොදෙන්නේ මේ නිසා ය:

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

විමසුම් ප්‍රති result ලයේ පළමු පේළිය 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
විමසුම් ප්‍රති result ලයේ පළමු පේළිය ROWNUM> 1 අනාවැකි (…) පසු නොකරයි - මෙය පැහැදිලි කිරීම සඳහා ඉහළට.
පියොටර් ඩොබ්‍රොගොස්ට්

6

SQL ප්‍රමිතිය

මෙම ලිපියෙන් මා පැහැදිලි කළ පරිදි , SQL: 2008 ප්‍රමිතිය SQL ප්‍රති result ල කට්ටලය සීමා කිරීම සඳහා පහත සඳහන් වාක්‍ය ඛණ්ඩය සපයයි:

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

ඔරකල් 11g සහ පැරණි අනුවාද

12c අනුවාදයට පෙර, Top-N වාර්තා ලබා ගැනීම සඳහා, ඔබට ව්‍යුත්පන්න වගුවක් සහ ROWNUM ව්‍යාජ තීරුව භාවිතා කිරීමට සිදු විය:

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

5

අඩු SELECT ප්‍රකාශ. එසේම, අඩු කාර්ය සාධනය පරිභෝජනය කරයි. බැර: 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
තවද, එය මුළුමනින්ම වැරදි පිළිතුරකි. ප්‍රශ්නය වූයේ වර්ග කිරීමෙන් පසුව සීමා කිරීමයි. එබැවින් රවුනම් උපවගන්තියෙන් බැහැර විය යුතුය.
බිට්ලොඩ්

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

ඔබ ඔරකල් 12 සී හි නොමැති නම්, ඔබට පහත පරිදි 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.
පියොටර් ඩොබ්‍රොගොස්ට්

IotPiotrDobrogost rownum පිටත පමණි.
sandi

2

මම 12c ට එරෙහිව වලංගු කරන ලද ඔරකල් 1z0-047 විභාගයට සූදානම් වීම ආරම්භ කළෙමි. ඒ සඳහා සූදානම් වන විට මට 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 - මෙය දැනටමත් වෙනත් පිළිතුරු වලින් සපයා ඇත. කරුණාකර මාස කිහිපයකට පෙර දැනටමත් පළ කර ඇති දේවල් පළ කිරීමෙන් වළකින්න.
මැට්

1
අනේ, සෑම පිළිතුරකින්ම නොගියෙමි, මම මුලදී උපසිරැසි හමු වූ අතර එය මතකයේ තබා ගනී.
arjun gaur

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()පදනම් විසඳුමක් ලෙස Downvote ඒ වන විටත් ලී රිෆල් විසින් පළ කර තිබුණි. ඇබ්බැහි වීමේදී පෙන්වා ඇති කේතයේ සින්ටැක්ස් දෝෂ තිබේ.
පියොටර් ඩොබ්‍රොගොස්ට්

1

විමසුමකින් ආපසු එන සෑම පේළියක් සඳහාම, ROWNUM ව්‍යාජ තීරුව ඔරකල් විසින් වගුවකින් හෝ පේළි සමූහයකින් පේළිය තෝරා ගන්නා අනුපිළිවෙල දැක්වෙන අංකයක් ලබා දෙයි. තෝරාගත් පළමු පේළියේ ROWNUM 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


ඇණවුම් කළ පේළි සීමා කිරීම පිළිබඳව ප්‍රශ්නය අසන අතර ඔබට
ඇණවුමක්වත්

IotPiotrDobrogost එය විශාල කාර්යයක් නොවන බව වටහා ගන්න, සියලු rdbms සඳහා මූල පද ඇණවුම් කිරීම පොදු වේ.
සුමේෂ් ටීජී

-1

SQL- සංවර්ධකයා සම්බන්ධයෙන්, එය ස්වයංක්‍රීයව ලබා ගන්නේ පළමු පේළි 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 ක් තෝරාගෙන ඇත.

SQL>


7
මෙය අදාළ වන්නේ ඔරකල් 12 සී සිට බව ඔබ සඳහන් කළ යුතු අතර, ඔබ එය කොහේ හෝ සිට පිටපත් කර අලවා ඇත - කරුණාකර සෑම විටම ඔබේ මූලාශ්‍ර උපුටා දක්වන්න.
මතෙ

මූලාශ්රය මෙය @Mat ය. රාකේෂ්, කරුණාකර අවම වශයෙන් මුල් ප්‍රශ්නයට පිළිතුර අනුවර්තනය කිරීමට උත්සාහ කරන්න. මම එකම මූලාශ්‍රය උපුටා දක්වමින් පිළිතුරක් ලබා දී ඇත, නමුත් මම පුළුල් වීමට උත්සාහ කර මුල් ප්‍රභවය උපුටා දැක්වුවෙමි.
sampathsris

-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
ප්‍රති OW ල කට්ටලයේ ROWNUM තීරුවක් බැවින් මෙය එක පේළියක්වත් නොදෙනු ඇත, එවිට අවසාන WHERE තත්වය සැමවිටම අසත්‍ය වේ. ප්ලස් ඔබට සහතික කිරීමේ නියෝගයකින් ROWNUM සහ නියෝගයක් භාවිතා කළ නොහැක.
බෙන්

2
විශිෂ්ටයි. අන් අයට අනතුරු ඇඟවීමක් ලෙස මෙය මෙහි තබමු.
EvilTeach

-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
මගේ නරක පිළිතුරෙන් පහත සොරකම් කිරීම සිත්ගන්නා කරුණකි.
EvilTeach
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.