Masz 4 pytania, a wszystkie dotyczą użycia i funkcjonalności ROWNUM . Odpowiem na każde pytanie jeden po drugim.
Dlaczego (to była moja pierwsza próba, dopóki nie wyszukałem SO) Wybierz * Od osoby Gdzie rownum> 100 i rownum <110; zwraca 0 wierszy ?
Ładne wyjaśnienie Thomasa Kyte dotyczące ROWNUM i paginacji tutaj.
ROWNUM wartość jest przypisywana do wiersza po przejściu przez fazę predykatu zapytania, ale zanim zapytanie wykona jakiekolwiek sortowanie lub agregację. Ponadto wartość ROWNUM jest zwiększana dopiero po jej przypisaniu, dlatego następujące zapytanie nigdy nie zwróci wiersza:
select *
from t
where ROWNUM > 1;
Ponieważ ROWNUM> 1 nie jest prawdziwe dla pierwszego wiersza, ROWNUM nie zwiększa się do 2. W związku z tym żadna wartość ROWNUM nigdy nie może być większa niż 1.
Dlaczego nie ma prostego sposobu na zrobienie czegoś takiego jak Select ... FROM ... GDZIE rownum BETWEEN lowerBound AND upperBound ?
Tak jest. Od Oracle 12c i dalej, możesz użyć nowego ograniczenia Top-n Row funkcja. Zobacz moją odpowiedź tutaj.
Na przykład poniższe zapytanie zwróci pracowników między 4 od najwyższej do 7 najwyższego wynagrodzenia w porządku rosnącym:
SQL> SELECT empno, sal
2 FROM emp
3 ORDER BY sal
4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
EMPNO SAL
---------- ----------
7654 1250
7934 1300
7844 1500
7499 1600
SQL>
Jak pozbyć się kolumny r w otrzymanych wartościach?
Zamiast select *
, wymień wymagane nazwy kolumn w zapytaniu zewnętrznym. W przypadku częstego używania zapytania tworzenie widoku jest prostą jednorazową czynnością.
Alternatywnie, w SQL*Plus
możesz użyć NOPRINT Komenda. Nie wyświetli nazwy kolumny, której nie chcesz wyświetlać. Jednak działałoby to tylko w SQL*Plus.
Na przykład
COLUMN column_name NOPRINT
Na przykład
Opis działuSQL> desc dept
Name Null? Type
----------------------------------------- -------- ------------
DEPTNO NUMBER(2)
DNAME VARCHAR2(14)
LOC VARCHAR2(13)
SQL> COLUMN dname NOPRINT
SQL> COLUMN LOC NOPRINT
SQL> SELECT * FROM dept;
DEPTNO
----------
10
20
30
40
SQL>
Czy zapewnia prawidłową paginację?
Tak, jeśli poprawnie wpiszesz zapytanie dotyczące stronicowania.
Na przykład
SELECT val
FROM (SELECT val, rownum AS rnum
FROM (SELECT val
FROM t
ORDER BY val)
WHERE rownum <= 8)
WHERE rnum >= 5;
VAL
----------
3
3
4
4
4 rows selected.
SQL>
Lub użyj nowej funkcji ograniczania wierszy na 12c, jak pokazano powyżej.
Kilka dobrych przykładów tutaj.