![]() |
¿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
¿en firebird como se puede hacer lo mismo? ¿un bucle por los registros devuelto y obtener la cantidad de registros? gracias |
Si preguntas cómo obtenerlo vía SQL, es fácil:
|
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:
|
Creo que preguntas como hacer lo que ejemplificas dentro de un Stored Procedure en Firebird.
Si fuera en Delphi, en casos como el que presentas y no averiguo cuantos hay. Recorro hasta llegar al final con un WHILE
|
|
Cita:
|
Cita:
// Saludos |
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. |
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 |
hola,
es más eficiente hacer count(1) que count(*) a efectos de trabajo del motor de bbdd. Saludos |
Cita:
( Gracias por desasnarme ;) ) Saludos :) |
Siempre uso un campo clave, ejemplo: count(id)
Pero nunca había visto count(1) ¿qué hace exactamente? |
Cita:
Código:
32934 fetches, 0 marks, 692 reads, 0 writes.
Código:
32760 fetches, 0 marks, 0 reads, 0 writes.Edito: Obtuve el mismo resultado usando COUNT(0) (0.031s) y una diferencia menor a COUNT(*), usando COUNT(ID) (0.047s) . |
|
Cita:
Pues así como puedo poner como constante un numero, también puedo contar cuantas veces sale dicha constante o sumarla con un Sum(1) |
COn este procedimiento puedo en cualquier momento saber cuantos registros tengo o decir en que registro voy de todos los que tengo |
Entiendo, aunque no le encuentro utilidad :D
|
Cita:
|
Por eso digo, es que yo siempre uso count(campoclave)
|
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 |
Eso depende de cada motor, aunque se sostiene en general lo que puse en el link. Basicamente:
SELECT COUNT(*) Es un alias a SELECT Count(Tabla) SELECT COUNT(UNA CONSTANTE) Cuenta sobre EL RESULTSET. SELECT COUNT(UnCampo) Cuenta sobre EL CAMPO El link de http://www.postgresqltutorial.com/po...ount-function/ esplica los PROS y CONTRAS. Es importante entender esto, porque COUNT es una función de agregado, y dependiendo de que se le este metiendo a esa función PUEDE OPERAR DE FORMA DIFERENTE, así como SUM, AVG y demás operan diferente dependiendo de que le metas. Cuando se hace COUNT(1) es un "truco" que se aplica erroneamente: http://stackoverflow.com/questions/1...ount-vs-count1 A proposito, en términos generales COUNT tiende a ser ineficiente, y de forma diferentes en cada motor. PostgresSql sufre mucho en este aspecto. Es por eso que la respuesta mejor a "como puedo hacer pasa conocer cuantos registros obtengo en un select en un stored procedure" NO ES repetir la consulta de nuevo con un COUNT! Es preguntarle al cursor cuantos resultados ya tiene (ej: user .recordcount). Count se debe usar como una funcion de agregado. Yo no vuelvo a sumar una columna que ya sume. Yo no vuelvo a contar la tabla que ya tengo en mi cursor. |
Cita:
// Saludos |
| La franja horaria es GMT +2. Ahora son las 13:03:15. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi