sql >> Databasteknik >  >> RDS >> Oracle

Hur ROWNUM fungerar i sidnumreringsfråga?

Du har fyra frågor och alla kretsar kring användningen och funktionen av ROWNUM . Jag kommer att svara på varje fråga en i taget.

Varför (detta var mitt första försök tills jag sökte på SO) Välj * Från person Där rownum> 100 och rownum <110; returnerar 0 rader ?

Fin förklaring av Thomas Kyte angående ROWNUM och paginering här.

Ett RADNUM värde tilldelas en rad efter att den passerat predikatfasen av frågan men innan frågan utförs någon sortering eller aggregering. Dessutom ökas ett ROWNUM-värde först efter att det har tilldelats, vilket är anledningen till att följande fråga aldrig returnerar en rad:

select * 
  from t 
 where ROWNUM > 1;

Eftersom ROWNUM> 1 inte är sant för den första raden, går ROWNUM inte vidare till 2. Därför får inget ROWNUM-värde någonsin vara större än 1.

Varför det inte finns något enkelt sätt att göra något som Välj ... FRÅN ... VAR radnummer MELLAN nedre gräns OCH övre gräns?

Ja, det finns. Från Oracle 12c och framåt kan du använda den nya begränsningen Top-n Row funktion. Se mitt svar här.

Till exempel skulle frågan nedan returnera de anställda mellan 4:e högsta till 7:e högsta lönerna i stigande ordning:

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>

Hur blir man av med kolumnen r i de resulterande värdena?

Istället för select * , lista de obligatoriska kolumnnamnen i den yttre frågan. För att du ofta använder frågan är att skapa en vy en enkel engångsaktivitet.

Alternativt i SQL*Plus du kan använda NOPRINT kommando. Det kommer inte att visa kolumnnamnet som du inte vill visa. Det skulle dock bara fungera i SQL*Plus.

Till exempel,

COLUMN column_name NOPRINT

Till exempel,

SQL> 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>

Säkerställer det korrekt sidnumrering?

Ja, om du skriver sideringsfrågan korrekt.

Till exempel,

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>

Eller använd den nya radbegränsande funktionen på 12c som jag har visat ovan.

Några bra exempel här.



  1. Hur kör du SQL från ett bash-skript?

  2. Hur man undviker att använda + i versionsnummer med SQLiteAssetHelper

  3. Hur kan jag ansluta till MySQL i Python 3 på Windows?

  4. Installera MySQL Python på Mac OS X