sql >> Database teknologi >  >> RDS >> Oracle

Mysteriet om rownum i oracle

ROWNUM er mærkeligt, fordi det kan evalueres som en del af en betingelse i forespørgslen - men hvis rækken ikke passerer det filter, vil ROWNUM værdien, som den blev tildelt, bliver tilgængelig til at blive brugt igen til næste række.

En vigtig effekt af dette er, at hvis du bruger en betingelse, der udelukker en ROWNUM værdi på 1, vil du aldrig få et match. Den første række, der skal testes mod denne betingelse, vil være række 1; men så vil den fejle i testen, så næste række vil da blive betragtet som række 1; og så videre.

Så din tilstand ROWNUM BETWEEN 2 AND 4 kan aldrig være sandt.

Den løsning, du har fundet, er den traditionelle. En anden ville være at bruge en analytisk funktion til at rangere rækkerne og derefter filtrere på rangeringen, f.eks.:

SELECT MI.* FROM (
  SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
  FROM ELEC_AUTO_MERC 
  ) MI
WHERE the_rank BETWEEN 2 AND 4;

Adskillige analytiske funktioner - RANK, DENSE_RANK og ROW_NUMBER - kan bruges til dette formål og vil give lidt forskellige resultater, især hvis der er bindinger. Tjek dokumenterne.




  1. SQL-forespørgsel returnerer kun første række

  2. Codeigniter Join med flere betingelser

  3. Sådan tilføjes og ændres XML-tags i PHP

  4. Sådan fungerer SIGN() i MariaDB