Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Geheimnis von Rownum im Orakel

ROWNUM ist insofern seltsam, als es als Teil einer Bedingung in der Abfrage ausgewertet werden kann - aber wenn die Zeile diesen Filter dann nicht passiert, wird die ROWNUM Wert, der ihm zugewiesen wurde, wird verfügbar, um erneut für die nächste Zeile verwendet zu werden.

Ein wichtiger Effekt davon ist, dass wenn Sie eine Bedingung verwenden, die ROWNUM ausschließt Wert von 1, erhalten Sie niemals eine Übereinstimmung. Die erste Zeile, die auf diese Bedingung getestet wird, ist Zeile 1; aber dann wird es den Test nicht bestehen, sodass die nächste Reihe dann als Reihe 1 betrachtet wird; und so weiter.

Also Ihre Bedingung ROWNUM BETWEEN 2 AND 4 kann niemals wahr sein.

Die Problemumgehung, die Sie gefunden haben, ist die traditionelle. Eine andere wäre, eine Analysefunktion zu verwenden, um die Zeilen zu ordnen, und dann nach dem Rang zu filtern, z. B.:

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;

Mehrere Analysefunktionen – RANK, DENSE_RANK und ROW_NUMBER – können für diesen Zweck verwendet werden und führen zu leicht unterschiedlichen Ergebnissen, insbesondere wenn es Unentschieden gibt. Sehen Sie sich die Dokumente an.