sql >> Databáze >  >> RDS >> Oracle

Jak ROWNUM funguje ve stránkovacím dotazu?

Máte 4 otázky a všechny se točí kolem použití a funkcí ROWNUM . Odpovím na každou otázku jednu po druhé.

Proč (toto byl můj první pokus, dokud nebudu hledat na SO) Vyberte * Od osoby Kde rownum> 100 a rownum <110; vrátí 0 řádků?

Pěkné vysvětlení Thomase Kytea ohledně ROWNUM a stránkování zde.

A ROWNUM hodnota je přiřazena řádku poté, co projde fází predikátu dotazu, ale předtím, než dotaz provede jakékoli třídění nebo agregaci. Hodnota ROWNUM se také zvýší až po jejím přiřazení, což je důvod, proč následující dotaz nikdy nevrátí řádek:

select * 
  from t 
 where ROWNUM > 1;

Protože ROWNUM> 1 neplatí pro první řádek, ROWNUM se neposune na 2. Žádná hodnota ROWNUM tedy nikdy nebude větší než 1.

Proč neexistuje jednoduchý způsob, jak udělat něco jako Select ... FROM ... WHERE rownum BETWEEN lowerBound A upperBound?

Ano, tam je. Z Oracle 12c dále můžete použít nové omezení nejvyšších řádků Vlastnosti. Viz moje odpověď zde.

Například níže uvedený dotaz vrátí zaměstnance mezi 4. nejvyšší do 7. nejvyšších platů ve vzestupném pořadí:

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 se zbavit sloupce r ve výsledných hodnotách?

Místo select * , uveďte požadované názvy sloupců ve vnějším dotazu. Pro časté používání dotazu je vytvoření pohledu jednoduchou jednorázovou aktivitou.

Případně v SQL*Plus můžete použít NOPRINT příkaz. Nezobrazí název sloupce, který nechcete zobrazit. Fungovalo by to však pouze v SQL*Plus.

Například,

COLUMN column_name NOPRINT

Například,

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>

Zajišťuje správné stránkování?

Ano, pokud správně napíšete dotaz na stránkování.

Například,

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>

Nebo použijte novou funkci omezení řádků na 12c, jak jsem ukázal výše.

Zde je několik dobrých příkladů.



  1. Vytváření nových tabulek v IRI Workbench

  2. Jak spustit, restartovat, zkontrolovat stav a zastavit server MySQL

  3. 9.6 Turnaj o nejděsivější patch

  4. Vytvoření databáze programově v SQL Server