sql >> Databasteknik >  >> RDS >> Oracle

Mysteriet med rownum i oracle

ROWNUM är konstigt eftersom det kan utvärderas som en del av ett villkor i frågan - men om raden sedan inte klarar det filtret, visas ROWNUM värdet som det tilldelades blir tillgängligt för att användas igen för nästa rad.

En viktig effekt av detta är att om du använder något villkor som utesluter en ROWNUM värde 1, du kommer aldrig att få en matchning. Den första raden som ska testas mot detta tillstånd kommer att vara rad 1; men då kommer den att misslyckas på testet, så nästa rad kommer då att betraktas som rad 1; och så vidare.

Så ditt tillstånd ROWNUM BETWEEN 2 AND 4 kan aldrig vara sant.

Lösningen du har hittat är den traditionella. En annan skulle vara att använda en analytisk funktion för att rangordna raderna och sedan filtrera på rangordningen, t.ex.:

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;

Flera analytiska funktioner - RANK, DENSE_RANK och ROW_NUMBER - kan användas för detta ändamål och kommer att ge lite olika resultat, särskilt om det finns kopplingar. Kolla in dokumenten.




  1. MYSQL-fråga - få rader där priset ändras

  2. PostgreSQL plpgsql få aktuella procedurer oid

  3. Hjälp att beräkna komplex summa i hierarkisk datauppsättning

  4. MySQL - Välj alla utom det som finns i den här tabellen