de-vraag
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
Mathieu Longtin
Mathieu Longtin
Question

Ako obmedziť počet riadkov vrátených dotazom Oracle po zoradení?

Existuje spôsob, ako dosiahnuť, aby sa dotaz Oracle správal tak, ako keby obsahoval klauzulu MySQL limit?

V MySQL to môžem urobiť:

select * 
from sometable
order by name
limit 20,10

získať 21. až 30. riadok (vynechať prvých 20, dať ďalších 10). Riadky sa vyberajú za order by, takže sa naozaj začína na 20. mene podľa abecedy.

V Oracle ľudia spomínajú iba pseudoslúpec rownum, ale ten sa vyhodnocuje pred order by, čo znamená toto:

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

vráti náhodnú sadu desiatich riadkov usporiadaných podľa mena, čo zvyčajne nie je to, čo chcem. Taktiež neumožňuje špecifikovať posun.

963 2009-01-22T19:48:43+00:00 3
 DineshDB
DineshDB
Edited question 26 marec 2018 в 9:39
Programovanie
sql
oracle
pagination
limit
Popular videos
Online Kurz Access I. Začiatočník - Ukážka - Backstage, Databázy, Tabulky, Polia, Typy, Excel
Online Kurz Access I. Začiatočník - Ukážka - Backstage, Databázy, Tabulky, Polia, Typy, Excel
pred 2 rokmi
Access - Zadávání podmínek pro dotazy
Access - Zadávání podmínek pro dotazy
pred 4 rokmi
Access - komplexní příklad tvorby tabulky s dotazy
Access - komplexní příklad tvorby tabulky s dotazy
pred rokom
Access: dotazy (základy, filtrování, řazení)
Access: dotazy (základy, filtrování, řazení)
pred rokom
Access - Výpočet ve výběrovém dotazu
Access - Výpočet ve výběrovém dotazu
pred rokom
SQL - Dotaz se zadávaným parametrem
SQL - Dotaz se zadávaným parametrem
pred 5 rokmi
Access - speciální dotazy
Access - speciální dotazy
pred rokom
Access - dotazy přes průvodce dotazem
Access - dotazy přes průvodce dotazem
pred 2 rokmi
Zjednocovací dotaz v MS Access
Zjednocovací dotaz v MS Access
pred 10 rokmi
PZD  ZLIN 6 vyberovy dotaz
PZD ZLIN 6 vyberovy dotaz
pred 4 rokmi
13 ACCESS Krizove dotazy
13 ACCESS Krizove dotazy
pred 4 rokmi
Dotazy v MS Access - kritéria pro text a číslo
Dotazy v MS Access - kritéria pro text a číslo
pred 9 rokmi
PZD  ZLIN 8 odstranovaci dotaz
PZD ZLIN 8 odstranovaci dotaz
pred 4 rokmi
16 ACCESS Pridavaci dotaz
16 ACCESS Pridavaci dotaz
pred 4 rokmi
MS Access - dotazy přes návrhové zobrazení
MS Access - dotazy přes návrhové zobrazení
pred 2 rokmi
« Predchádzajúci
Ďalšie »
This question has 1 odpoveď in English, to read them log in to your account.
 Kosi2801
Kosi2801
22 január 2009 в 7:55
2009-01-22T19:55:58+00:00
Viac na
Zdroj
Upraviť
#8766633

Môžete na to použiť poddotaz, ako napríklad

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

Pozrite si tiež tému On ROWNUM and limiting results na Oracle/AskTom, kde nájdete ďalšie informácie.

Aktualizácia: Na obmedzenie výsledku pomocou dolných aj horných hraníc sa veci trochu viac nafúknu pomocou

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;

(Skopírované z uvedeného AskTom-článku)

Aktualizácia 2: Počnúc verziou Oracle 12c (12.1) je k dispozícii syntax na obmedzenie riadkov alebo začiatok v offsete.

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

Viac príkladov nájdete v tejto odpovedi. Za nápovedu ďakujeme Krumia.

 Kosi2801
Kosi2801
Edited answer 25 október 2014 в 7:18
769
0
Leigh Riffel
Leigh Riffel
23 január 2009 в 2:28
2009-01-23T14:28:08+00:00
Viac na
Zdroj
Upraviť
#8766635

Analytické riešenie len s jedným vnoreným dotazom:

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

Rank() by mohol byť nahradený Row_Number(), ale môže vrátiť viac záznamov, ako očakávate, ak existujú duplicitné hodnoty pre meno.

 sampathsris
sampathsris
Edited answer 14 január 2016 в 10:52
53
0
 EvilTeach
EvilTeach
22 január 2009 в 8:21
2009-01-22T20:21:56+00:00
Viac na
Zdroj
Upraviť
#8766634

(neotestované) niečo také by mohlo splniť svoju úlohu

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

Existuje aj analytická funkcia rank, ktorú môžete použiť na usporiadanie podľa.

-4
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Jasur Fozilov
Registered pred 9 hodinami
2
Zuxriddin Muydinov
Registered pred dňom
3
Денис Анненский
Registered pred 3 dňami
4
365
Registered pred týždňom
5
True Image
Registered pred týždňom
BG
DE
EL
ES
FI
FR
ID
IT
JA
LT
NL
PL
PT
RU
SK
ZH
© de-vraag 2022
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora