Sql - cum funcționează rownum în cererea paginii oracole - paginare, cod q - un rus (en)

Deci, vreau să select un număr de rânduri în Oracle DB. Trebuie să fac acest lucru pentru că am milioane de rânduri în tabel și vreau ca rezultatele personalizate să fie paginate (dacă știți un alt mod de a face acest lucru pe partea clientului, eu folosesc JavaFX dacă asta contează, dar nu cred că este o idee bună să trimiteți toate datele prin rețea pentru a le rupe pe partea clientului).

100 și 110 sunt doar un exemplu. În cerere, solicit pur și simplu o limită inferioară și adăugați o dimensiune de 10_000 pentru a obține următoarele 10_000 rânduri.

Acum rezultatul este o coloană de rownum și nu vreau să o văd. Deoarece nu sunt foarte versat în SQL, aici sunt întrebările mele:

  1. De ce (aceasta a fost prima mea încercare, până când am selectat * De la persoană Unde rownum> 100 și rownum <110; SO). Select * From Person Where rownum> 100 și rownum <110; Возвращает 0 строк?

De ce nu există o cale ușoară de a face ceva de genul Selectare. DIN. WHERE rownum între partea inferioară și cea superioară.

Cum să scapi de coloana r în valorile rezultate? De acolo, SQL exclude o coloană folosind SELECT * [cu excepția coloanei A] FROM tableA? Trebuie să fac o apreciere sau o tabelă temporară, dar există o altă modalitate de a se potrivi interogării mele?

Oferă paginarea corectă? Am citit secțiunea din acest articol, "Împărțirea unei pagini utilizând ROWNUM", care a spus că trebuie să comand valori ceva unic pentru a obține o defalcare consecventă a paginilor (deci cred că ordonarea de către rownum este ok dacă puteți confirma) . Nu învinge scopul utilizării lui FIRST_ROWS (N).

Sper că acest lucru nu este prea mult, aș putea să mă separ în întrebări individuale, dar cred că este important să se prăbușească, deoarece sunt strâns legate.

Aveți 4 întrebări și toate se rotesc în jurul utilizării și funcționalității ROWNUM. Voi răspunde la fiecare întrebare unul câte unul.

De ce (aceasta a fost prima mea încercare, până când am căutat SO). Selectați * De la persoana în care se află rownum> 100 și rownum <110; Возвращает 0 строк?

O explicație bună a lui Thomas Keith cu privire la ROWNUM și paginare aici.

Valoarea ROWNUM este atribuită șirului după trecerea fazei predicate interogare, dar înainte ca interogarea să efectueze orice sortare sau agregare. În plus, valoarea ROWNUM este incrementată numai după ce este atribuită, astfel că următoarea interogare nu va întoarce niciodată un rând:

Deoarece ROWNUM> 1 nu corespunde primei linii, ROWNUM nu merge la 2. Prin urmare, nici o valoare ROWNUM nu va fi niciodată mai mare de 1.

De ce nu există o cale ușoară de a face ceva de genul Selectare. DIN. Unde este rownum ÎNTRE MICĂ și inferioară?

Da, există. Începând cu Oracle 12c. puteți utiliza noua funcție de restricționare Top-n Row. Vedeți răspunsul meu aici.

De exemplu, interogarea de mai jos va întoarce angajații de la 4 la 7 salarii mai mari în ordine ascendentă:

Cum să scapi de coloana r în valorile rezultate?

În loc să selectați *. selectați * numele coloanelor necesare în interogarea externă. Pentru utilizarea frecventă a unei interogări, crearea unei vizualizări este o sarcină simplă de timp unică.

Alternativ, în SQL * Plus, puteți utiliza comanda NOPRINT. Nu afișează numele coloanei pe care nu doriți să o afișați. Cu toate acestea, va funcționa numai în SQL * Plus.

Oferă paginarea corectă?

Da, dacă scrieți corect cererea de întrerupere a paginii.

Sau, utilizați noua funcție de restricționare a șirului pe 12c, așa cum am arătat mai sus.

Sunt câteva exemple bune aici.

Răspunsul la întrebarea 2: În Oracle 12, puteți utiliza paginarea