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

Záhada rownum v orákulu

ROWNUM je zvláštní v tom, že jej lze vyhodnotit jako součást podmínky v dotazu – ale pokud řádek poté neprojde tímto filtrem, ROWNUM hodnota, která byla přiřazena, bude k dispozici pro opětovné použití pro další řádek.

Jedním z důležitých efektů je, že pokud použijete jakoukoli podmínku, která vylučuje ROWNUM hodnotu 1, nikdy nezískáte shodu. První řádek, který bude testován na tuto podmínku, bude řádek 1; ale pak test neprojde, takže další řádek bude považován za řádek 1; a tak dále.

Takže vaše podmínka ROWNUM BETWEEN 2 AND 4 nikdy nemůže být pravda.

Řešení, které jste našli, je tradiční. Dalším by bylo použít analytickou funkci k hodnocení řádků a poté filtrovat podle hodnocení, např.:

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;

K tomuto účelu lze použít několik analytických funkcí – RANK, DENSE_RANK a ROW_NUMBER – a poskytnou mírně odlišné výsledky, zejména pokud existují remízy. Podívejte se na dokumenty.




  1. SQL vybírá řádky podle nejnovějšího data se dvěma jedinečnými sloupci

  2. Správa vysoké dostupnosti v PostgreSQL – Část II:Správce replikací

  3. Dokážete vyřešit tento jednoduchý SQL dotaz?

  4. Výběrový dotaz JPA s poli s časovým razítkem a datem nenačte výsledky