sql >> Database >  >> RDS >> Oracle

Mysterie van rownum in orakel

ROWNUM is raar omdat het kan worden geëvalueerd als onderdeel van een voorwaarde in de query - maar als de rij dat filter dan niet doorstaat, wordt de ROWNUM waarde die eraan was toegewezen, wordt beschikbaar om opnieuw te worden gebruikt voor de volgende rij.

Een belangrijk effect hiervan is dat als u een voorwaarde gebruikt die een ROWNUM uitsluit, waarde van 1, je krijgt nooit een match. De eerste rij die aan deze voorwaarde wordt getoetst, is rij 1; maar dan zal het de test niet doorstaan, dus de volgende rij wordt dan als rij 1 beschouwd; enzovoort.

Dus je conditie ROWNUM BETWEEN 2 AND 4 kan nooit waar zijn.

De oplossing die u hebt gevonden, is de traditionele. Een andere mogelijkheid is om een ​​analytische functie te gebruiken om de rijen te rangschikken en vervolgens op de rangorde te filteren, bijvoorbeeld:

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;

Verschillende analytische functies - RANK, DENSE_RANK en ROW_NUMBER - kunnen voor dit doel worden gebruikt en zullen enigszins andere resultaten opleveren, vooral als er verbanden zijn. Bekijk de documenten.




  1. Docker mysql kan geen verbinding maken met container

  2. Verwijder objecten in NESTED JSONB-arrays met PostgreSQL

  3. plsql-blok om het dynamische SQL-queryresultaat te krijgen

  4. Geheugenlek in JDBC4Connection