Ir al contenido


Foto

[RESUELTO] Insertar registros por medio de un Zquery


  • Por favor identifícate para responder
24 respuestas en este tema

#21 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 04 julio 2009 - 06:15



sql
  1. SELECT * FROM (SELECT FIRST 10 * FROM central ORDER BY entradadatos DESC) ORDER BY entradadatos



en la consulta ya no te haria falta el first porque la subconsulta solo te devuelve 10, estarias haciendo un  doble filtrado


No se como trabajan las sentencias first, o incluso no se si existe una sentencia LAST, pero me imagino que asi sea mas eficiente lo que buscas:



sql
  1. SELECT LAST 10 * FROM central ORDER BY entradadatos ASC



Alguien me podria informar al respecto por favor :D
  • 0

#22 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 04 julio 2009 - 08:24

voy a probar lo que dices del primer first. En cuanto a lo de Last, lo probe en IBexpert y me da error, al parecer esa sentencia no existe. Imagino que la logica es que si pones en el order desc ya es un last
  • 0

#23 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 julio 2009 - 09:32

Hola, tengo entendido que para obtener los n últimos registros se debe hacer algo como:



sql
  1. SELECT FIRST 10 *
  2. FROM Tabla
  3. ORDER BY Campo DESC



Pero claro, en SQL y en motores de bases de datos relacionales el orden de los registros no tiene sentido.
Con dicha instrucción sólo obtenemos los 10 últimos de forma descendiente, más no los 10 útimos registros. Nótese la diferencia.

Se debe por tanto hacer uso de SKIP. Algo como:



sql
  1. SELECT FIRST 10 SKIP N *
  2. FROM Tabla
  3. ORDER BY Campo



Siendo N la cantidad de registros, menos 10. Es decir que si por ejemplo hay 1000 registros, N debe ser 990.

Léase esto.

Saludos,
PD: Tengo entendido que no existe LAST en Firebird.
  • 0

#24 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 05 julio 2009 - 12:09

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.


  • 0

#25 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 julio 2009 - 12:51

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:



sql
  1. SELECT FIRST 100 SKIP 69900 *
  2. FROM Tabla
  3. ...
  4. ORDER BY ...



Lee la documentación de Firebird sobre el uso de FIRST, SKIP.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.