limitar los registros afectados por una query

juanolas
18 de Noviembre del 2003
hola a todos-as,
tengo una aplicacion en visual basic contra access 97 y quisiera saber si se puede limitar el numero de registros afectados por una query desde la misma query ,en oracle se hacia poniendo en la query :
"and row_num = 1 "
asi solo cogia un registro
¿alguien sabe como se puede hacer esto mismo en access??
muchas gracias por su atencion
saludos

Baltasar
18 de Noviembre del 2003
Select top 1 * from tabla where LOQUESEA order by nombre

eso te devuelve el primer elemento de ese select, según ese orden.
Ventajas?
pues que puedes poner "select top 20 * from . . ." y te devuelve los primeros 20

esto servirá para algo útil? pues imagínate poder hacer un select que te devuelva los 10 clientes que más te compran, por ejemplo.

Saludos

juanolas
18 de Noviembre del 2003
muchas gracias por tu respuesta baltasar ,era esactamente lo que queria, pero ahora tengo el problema de que quiero usarlo para hacer una delete y parece que no me lo hacepta ,
¿alguna idea?
saludos

Baltasar
18 de Noviembre del 2003
si lo que intentas hacer es directamente DELETE TOP 10 * FROOM . . . está bien claro que no te dejará. Has de hacer una subconsulta para seleccionarlos. Te pongo un ejemplo:

delete * from clientes where codigo in (select top 10 codigo from clientes order by codigo)

esto eliminará los primeros 10 clientes (ordenados por código) de esa base de datos.

NOTA: cuidado al jugar con la sentencia DELETE si no tenemos muy claro cómo manejar el SQL, podríamos cometer una locura!

Saludos

juanolas
18 de Noviembre del 2003
creo que no se puede montar la eliminacion con ese tipo de subconsulta sino haz la prueba ,¿alguna otra idea?

ojeador
18 de Noviembre del 2003
He comprobado el codigo enviado por baltazar, y funciona correctamente.

juanolas
18 de Noviembre del 2003
no entiendo por que la subconsulta no me devuelve el valor que quiero ,mi problema es que para los valores especificados en el where de mi subconsulta tengo dos registros y yo solo eliminar solo uno ,por favor diganme en que me equivoco
muchas gracias por echarme un cabo

Baltasar
18 de Noviembre del 2003
Perdona que antes no pusiera la respuesta correcta, pero quería que trataras de comprobar lo que habías escrito en tu sentencia.

en mi ejemplo te puse:
delete * from clientes where codigo in (select top 10 CODIGO from clientes . . . .

y tú has puesto

delete from clientes where codigo in (select top 1 * from clientes . . .

en mi ejemplo, para decirlo de alguna manera, yo le digo: delete * from clientes where codigo in (1,2,3,4...10) mientras que tú le dices:
delete from clientes wuere codigo in (1 , pepito lopez, salamanca, etc etc)

entiendes la diferencia?

Esa forma de eliminar funciona, te lo aseguro, pero como ya te he comentado, hay que usarla con prudencia. Incluso podrías hacer una sentencia que te borre sólo aquellos que estén duplicados.

Saludos

juanolas
18 de Noviembre del 2003
la consulta es la siguiente:
" delete from clientes " _
& " where codigo in " _
& " ( select top 1 * from clientes " _
& " where codigo = '1' " _
& " and nombre = 'manolo' " _
& " and direccion = 'aaa' " _
& " and telefono = 1 " _
& " and edad = 2" _
& " order by codigo )", adUseClient
y el error que me da:
Ha escrito una subconsulta que puede devolver más de un campo sin utilizar la palabra reservada EXISTS en la cláusula FROM de la consulta principal. Corrija la instrucción SELECT de la subconsulta para solicitar un único campo. (Error 3306)

Baltasar
18 de Noviembre del 2003
Eso no coincide con el ejemplo que te he puesto.
la subconsulta que estás haciendo no te devuelve el valor que necesitas. Examina bien lo que has puesto y lo verás.