Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Select aleatorio (https://www.clubdelphi.com/foros/showthread.php?t=45217)

JBalda 26-06-2007 18:27:20

Select aleatorio
 
Hola foro:

Mi consulta es la siguiente: Como puedo hacer con sql para obtener una cantidad x de registros de una tabla en forma aleatoria?

Utilizo Firebird 2.0, delphi 6.

Saludos

egostar 26-06-2007 19:36:16

Hola JBalda, no te limites en cuanto a espacio, ya has hecho algo:confused:, tienes algún error:confused:, en fin, entre mas información nos des seguro se te va a poder ayudar de una manera mejor.

Por otro lado te doy la bienvenida y te recomiendo que leas la guía de estilo para que conozcas las reglas de nuestro foro.

Salud OS.

JBalda 26-06-2007 20:16:10

Select aleatorio
 
Bueno Egostar, tratare de ser mas especifico. Dentro de una base de datos firebird tengo una tabla de stock de articulos. Mi aplicacion entre otras cosas permite efectuar inventarios sobre el 100% de la tabla de articulos o sobre una cantidad parcial. La pregunta concreta es si conocen alguna forma de tirar una select sobre dicha tabla que me retorne una cantidad de registros previamente ingresada, de manera aleatoria.
Lei algo en este foro sobre la funcion RAND() , pero no se como utilizarla.

Saludos

Delphius 26-06-2007 20:30:05

Estuve pensando...

No se si se permitirá pasar parámetros en la sentencia first. Mi idea es generar un SQL algo similar a esto:

Código SQL [-]
SELECT FIRST :Cantidad tus_campos FROM tu_tabla

Y hacer que el parámetro cantidad recibe un número aletorio:

Código Delphi [-]
Params.ByName('Cantidad').AsInteger := Random(ValorMáximo) + 1;

El +1 se debe a que random puede devolver 0 y provocar un error.
No he probado esto...
En este momento no tengo Delphi.

marcoszorrilla 26-06-2007 20:42:16

Yo te iba a proponer algo parecido utilizando:
Código SQL [-]
Select First(x)  Skip(x) *
From MiTabla

Pero al decir aleatorio no veo bien que es lo que quieres, porque seleccionar las 100 filas primeras yo no lo veo como aleatorio, a no ser que lo que quieras sea seleccionar un número aleatorio de filas y entonces la respuesta dada por Delphius es la correcta?

Con este método lo que es aleatorio es el número de filas, pero no las filas en sí.

Un Saludo.

JBalda 26-06-2007 22:38:27

Ante todo muchas gracias por sus prontas respuestas. Efectivamente lo que necesito son filas aleatorias y no una determinada cantidad. Por ejemplo, si mi tabla tiene 100 registros, genero 3 nros aleatorios (15,78,91), como resultado deberia obtene el registro nro 15,78 y 91.


saludos.

marcoszorrilla 26-06-2007 23:02:23

De no tener un campo autoincremento y seleccionarlos por ahí, creo que no quedará más remedio que crear una tabla auxilar.

Hacer avanzar el puntero hasta el registro 15, insertarlo en la tabla auxiliar y así hasta el final.(78....):

Un Saludo.

JBalda 27-06-2007 00:36:34

Utilizando select First y Skip y luego grabando una tabla temporal logro lo que estaba buscando. No se si sera la forma mas optima pero funciona.

Gracias marcoszorrilla y foro.

Saludos

TJose 27-06-2007 02:54:22

Hola

Cita:

Por ejemplo, si mi tabla tiene 100 registros, genero 3 nros aleatorios (15,78,91), como resultado deberia obtene el registro nro 15,78 y 91.
y si haces
Código SQL [-]
select * from mitabla where id in (15,78,91)

Saludos
TJose

Delphius 27-06-2007 03:21:56

Como lo expone TJose anda...

Lo acabo de probar con IBExpert y funciona.
Saludos,

JBalda 27-06-2007 14:36:44

Cita:

Empezado por TJose


y si haces

Código SQL [-]

select * from mitabla where id in (15,78,91)



Correcto TJose, pero funciona siempre y cuando tengas un campo id secuencial en tu tabla, lamentablemente no es mi caso.

TJose 27-06-2007 20:28:23

Hola

debes crear un stored procedure que te devuelva datos y dentro de este crear un campo artificial con el ordinal del registro.

Aqui se mustra como hacer el procedimiento.

Saludos
TJose


La franja horaria es GMT +2. Ahora son las 22:46:07.

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