Hola delphius
Tienes razon, pero en este caso la consulta se basa en un campo autoincrementable. Esto crea una secuencia, por lo tanto el uso de DESC o ASC te va a dar los ultimos o los primeros. Por otro lado no me queda claro el uso de skip, ya que si tengo mas 700,000 registros y quiero los ultimos 10 pero si no se cuantos exactamente tengo. Tendria que contarlos primero para poder poner Skip N.
Pues que yo sepa, np interesa si son incrementables o no.
La consulta debería funcionar siempre independiente del campo.
El uso de SKIP es para posicionarse en el registro nro N. Veamos como te explico, en los motores de base de datos relacionales basados en SQL los registros
no son ordenados físicamente en el orden en que se ingresan, más bien están ordenados siguiendo una estructura en árbol-B.
Los registros se ordenan de forma azarosa, siguiendo dicha estructura en árbol, en algunas operaciones complejas basadas en el uso del índice, etc. Simplemente,
no sabemos el orden físico en el que están ordenados.
Cuando uno hace un select, obtiene los registros (por defecto) ordenados ascendentemente según el campo indicado y/o el índice principal que posea la tabla.
Estos registros, pueden o no, estar ordenados físicamente así. Por ejemplo: supongamos que tenemos un índice para un campo CANTIDAD. Registramos en éste orden: 60, 20, 40, 58. Realizamos la consulta y obtenemos: 20, 40, 58, 60. Como se ve el resultado de la consulta
no nos muestra el orden en el que físicamente fueron registrados, nos los da ordenados según el índice.
Y si uno le pide que nos los regrese de forma descendiente, lo que hace es invertir el orden: desde el final hacia el comienzo. Viéndolo gráficamente sería algo como:
SELECT .... ASC:
[tt]
****** > 1
****** > 2
------
------
------ > n
[/tt]
SELECT .... DESC:
[tt]
****** > n
****** > n - 1
------
------ > 2
------ > 1
[/tt]
Nadie nos asegura, que estos registros estén ordenados así en la base de datos.
Lo mismo sucede cuando uno hace un select FIRST m... nos devuelve los
m primeros que pertenecen a la consulta más
no nos asegura que sean los m primeros registros físicos.
Es por ello que existe SKIP. Para posicionarse en el
registro físico n-ésimo. De este modo, cuando uno hace select FIRST m SKIP n obtendrá los m registros a partir del n-ésimo registro físico.
¿Me explico?
Evidentemente, si deseas obtener los últimos n registros físicos, debes previamente saber la cantidad que hay (select count(campo) (1) ). Y después lanzar una consulta select first m skip n....
(1) Desaconsejo el uso de count(*). Esto obliga al motor llevar consultas innecesarias y redundantes, ya que previamente debe hacer algunas consultas a las tablas del sistema para saber que y cuantos campos pertenecen a la tabla.
Por ejemplo, si tienes 70000 registros y deseas los últimos 100, harás algo como:
SELECT FIRST 100 SKIP 69900 *
FROM Tabla
...
ORDER BY ...
Lee la documentación de Firebird sobre el uso de FIRST, SKIP.
Saludos,