Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-11-2014
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 22
JXJ Va por buen camino
Question ¿como saber cuantos registros devuelve un select?

hola.

comop puedo hacer pasa conocer cuantos registros obtengo en un select en un stored procedure

en delphi hago una consulta
Código Delphi [-]
select * from tabla where alumno = 'jxj'
//y con un 
for i := o to query1.recordcount - 1 do 
begin
// aqui hago algo
end;


// o solo con el recordCount  obtengo la cantidad de registros

¿en firebird como se puede hacer lo mismo?
¿un bucle por los registros devuelto y obtener la cantidad de registros?


gracias
Responder Con Cita
  #2  
Antiguo 14-11-2014
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Si preguntas cómo obtenerlo vía SQL, es fácil:

Código SQL [-]
SELECT COUNT (*) AS num_registros FROM tabla WHERE blablabla;
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 14-11-2014
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Imagino que los motores hacen esto mismo cuando ejecutas la SQL que te ha puesto Ñuño, pero yo por costumbre suelo hacer una cosa asi:

Código SQL [-]
SELECT COUNT (campo_clave_primaria) FROM TABLA WHERE 'blablabla'
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 14-11-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Creo que preguntas como hacer lo que ejemplificas dentro de un Stored Procedure en Firebird.

Código SQL [-]
for select campo1, campo2, ... from alumnos
    where alumno = 'jxj'
    into :var1, :var2
begin
    /* hago algo */
end

Si fuera en Delphi, en casos como el que presentas y no averiguo cuantos hay. Recorro hasta llegar al final con un WHILE
Código Delphi [-]
while not Query1.EOF do
begin
   // Hago algo
   Next;
end;

Última edición por duilioisola fecha: 14-11-2014 a las 12:27:09.
Responder Con Cita
  #5  
Antiguo 14-11-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.735
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Código SQL [-]
/* Ejemplo para sacar un promedio de notas de un alumno */
create procedure promedio (
    alumno varchar(10))
returns (
    promedio double precision)
as
declare variable cantidad integer;
declare variable total_nota double precision;
begin
    /* Averiguo cuantas notas hay */
    select count(*)
    from notas_alumnos
    where
    alumno = :alumno
    into :cantidad;

    /* Sumo las notas */
    totalnota = 0;
    for select nota
        from notas_alumnos
        where
        alumno = 'jxj'
        into :nota
    do
    begin
        totalnota = totalnota + nota;
    end

    /* Calculo el promedio */
    promedio = totalnota / cantidad;

    suspend;
end
Responder Con Cita
  #6  
Antiguo 14-11-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por duilioisola Ver Mensaje
Si fuera en Delphi, en casos como el que presentas y no averiguo cuantos hay. Recorro hasta llegar al final con un WHILE
Código Delphi [-]
while not Query1.EOF do 
begin    
  // Hago algo    
  Next; 
end;
No recuerdo ahora, de memoria, pero para hacer eso será mejor algo así:
Código Delphi [-]
Query1.Last
Query1.RecordCount
Responder Con Cita
  #7  
Antiguo 14-11-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Casimiro Notevi Ver Mensaje
No recuerdo ahora, de memoria, pero para hacer eso será mejor algo así:
Código Delphi [-]
Query1.Last
Query1.RecordCount
Ya, pero eso es poco práctico. Mejor el count(*).

// Saludos
Responder Con Cita
  #8  
Antiguo 14-11-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Sí, pero es que dice "desde delphi" y hace un bucle desde inicio hasta el final.

Desde delphi también puede hacer el count, desde luego.
Responder Con Cita
  #9  
Antiguo 14-11-2014
JXJ JXJ is offline
Miembro
 
Registrado: abr 2005
Posts: 2.475
Poder: 22
JXJ Va por buen camino
A eso me refirero todo en Stored procedure de firebird yo le llamo PL/SQL pero me han dicho que en firebird no se llama asi. solo en oracle.

duilioisola

no sabia que con un bucle for se podia recorrer los resultados de una consulta.

Si Roman, con un count(*) obtengo la cantidad de registros, lo acabo de probar.


gracias
Responder Con Cita
  #10  
Antiguo 14-11-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
hola,
es más eficiente hacer count(1) que count(*) a efectos de trabajo del motor de bbdd.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #11  
Antiguo 14-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por fjcg02 Ver Mensaje
hola,
es más eficiente hacer count(1) que count(*) a efectos de trabajo del motor de bbdd.
...
¡ Esa no la tenía registrada !

( Gracias por desasnarme )

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
Antiguo 14-11-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Siempre uso un campo clave, ejemplo: count(id)
Pero nunca había visto count(1) ¿qué hace exactamente?
Responder Con Cita
  #13  
Antiguo 14-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Siempre uso un campo clave, ejemplo: count(id)
Pero nunca había visto count(1) ¿qué hace exactamente?
Si, sería bueno saberlo... Mirando las estadísticas hay una marcada diferencia (sobre 17698 pacientes):
Código SQL [-]
SELECT COUNT(*) FROM PACIENTES
Código:
32934 fetches, 0 marks, 692 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 48 index, 15698 seq.
Delta memory: 21436 bytes.
Total execution time: 0.156s

Código SQL [-]
SELECT COUNT(1) FROM PACIENTES
Código:
32760 fetches, 0 marks, 0 reads, 0 writes.
0 inserts, 0 updates, 0 deletes, 0 index, 15698 seq.
Delta memory: 96 bytes.
Total execution time: 0.031s
Saludos

Edito: Obtuve el mismo resultado usando COUNT(0) (0.031s) y una diferencia menor a COUNT(*), usando COUNT(ID) (0.047s) .
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 14-11-2014 a las 22:45:24.
Responder Con Cita
  #14  
Antiguo 14-11-2014
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Explicado y con pros y contras:

http://stackoverflow.com/questions/2...hich-is-better
__________________
El malabarista.
Responder Con Cita
  #15  
Antiguo 15-11-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Siempre uso un campo clave, ejemplo: count(id)
Pero nunca había visto count(1) ¿qué hace exactamente?
pues en un query uno puede hacer algo como:
Código SQL [-]
Select 1 as numero_Constante, id, nombre, 'Casi' as NombreConstante from MiTabla where fecha between :f1 and :f2

Pues así como puedo poner como constante un numero, también puedo contar cuantas veces sale dicha constante o sumarla con un Sum(1)
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #16  
Antiguo 15-11-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Código SQL [-]
create procedure SpAlgo (alumno varchar(10)) returns (cantidad integer, RegistroActual integer,id Integer, Nombre varchar(100)) as 
begin     
   select count(1) from notas_alumnos where alumno = :alumno into :cantidad;
   RegistroActual = 0;
   for select nombre, id from notas_alumnos where alumno = :alumno   into :nombre, :id  do
   begin
      registroActual = registroActual + 1;
      suspend;
   end  
end

COn este procedimiento puedo en cualquier momento saber cuantos registros tengo o decir en que registro voy de todos los que tengo
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"

Última edición por RONPABLO fecha: 15-11-2014 a las 08:54:41.
Responder Con Cita
  #17  
Antiguo 15-11-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Entiendo, aunque no le encuentro utilidad
Responder Con Cita
  #18  
Antiguo 15-11-2014
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Entiendo, aunque no le encuentro utilidad
no le encuentras utilidad a count(1) ?, pues la utilidad es que consume menos recursos comparado a un count(*), y el count(UnCampo) existe la posibilidad de que el campo sea null (aunque en la clave primaria no) y no sea contado
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #19  
Antiguo 15-11-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Por eso digo, es que yo siempre uso count(campoclave)
Responder Con Cita
  #20  
Antiguo 16-11-2014
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
Hola,
respecto a lo de count(1), yo no lo sabía hasta que hace un año un "gurú" me dijo que lo hiciera así. Es una persona con conocimientos de Oracle de muchísimo nivel. Cuando pueda le preguntaré porqué es más eficiente.

Bajo mi punto de vista, y dado que cuando haces un count de un campo el motor debe evaluar si es nulo o no, ahí puede haber una pérdida de tiempo. Sin embargo, si pones count(1), solamente revisará si hay registro o no, independientemente del valor que tengan los campos. Aunque esto indudablemente dependerá de cada motor de bbdd , de cómo parsee las sentencias sql y qué ejecute realmente tras el parseo. Ya sabeis que los motores en ocasiones hacen una transformación de las sentencias sql para optimizar los resultados ( aunque en ocasiones consigan lo contrario).

Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cuantos registros devuelve una consulta kizé MySQL 1 25-10-2010 10:13:30
Saber cuantos registros tiene un GridView JuanErasmo .NET 1 02-01-2007 21:19:32
dbGrid como devuelve el numero de registros omarifr Conexión con bases de datos 3 15-07-2005 20:56:58
Saber cuantos registros origino la consulta JorgeBec SQL 1 12-11-2004 16:48:17
Select Max siempre devuelve valor FernanGil Conexión con bases de datos 3 06-10-2003 15:55:36


La franja horaria es GMT +2. Ahora son las 08:37:00.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi