Consulta con clausula TOP variable

17/03/2007 - 13:24 por Vicente Flich | Informe spam
Hola de nuevo a todos:

Necesito resolver un problema mas... Desde mi aplicacion ODBC quiero hacer
un select con una clausula TOP variable dependiendo de otra consulta.

Me explico mejor con un ejemplo, de una tabla de facturas por ejemplo, en la
que pueden haber logicamente varios registros de un mismo cliente. Pues
quiero recuperar con un select todas las facturas de un cliente determinado
mas 1 (la del siguiente cliente ordenado por cliente. Por ejemplo de los
siguientes registros:

CLIENTE,FACTURA
001,fra.1
001,fra.2
002,fra16
002,fra3
002,fra22
004,fra25
004,fra33

Quiero un select para recuperar los registros del cliente 002 ademas de la
primera factura del siguiente cliente, osea:

002,fra16
002,fra3
002,fra22
004,fra25

He intentado algo como:

SELECT *
TOP((SELECT COUNT(*)FROM FACTURAS WHERE CLIENTE='002') + 1)
FROM FACTURAS
WHERE CLIENTE>='002'
ORDER BY CLIENTE

Seguramente sea una burrada, pero se entiende no? Por supuesto no funciona
:-(

Finalmente, lo he resuelto con 2 llamadas al ODBC desde mi aplicacion:
primero saco el count con:
SELECT COUNT(*) FROM FACTURAS WHERE CLIENTE='002'
y luego otra llamada a ODBC con:
SELECT TOP(n+1)FROM FACTURAS WHERE CLIENTE>='002' ORDER BY CLIENTE

Asi si que funciona logicamente, pero al ser 2 llamadas por ODBC va mas
lento, por eso busco una sentencia SELECT que lo haga todo a la vez...

Otra posibilidad que se me ocurre es desarrollar un stored procedure, aunque
preferiria la sentencia SELECT.

¿Alguien puede orientarme?

Saludos,
Vicente Flich

Preguntas similare

Leer las respuestas

#6 Vicente Flich
17/03/2007 - 18:20 | Informe spam
Es en SQL 2005. Pero no entiendo lo del to(@variable). Primero deberia
asignar la variable con otra consulta, cosa que es lo que quiero evitar.

Saludos,
Vicente Flich

"Maxi" escribió en el mensaje
news:uSQ2%
Hola, en sql2000 no se oermiten este tipo de operaciones pero en 2005 si,

select top(@variable) from tabla

Si usas 2000 o bien tenes que hacer lo que te comentaron en el post


antrior
o sino usar SQL-dinamico sp_executesql o sino tambien podes trabajar con


la
sentencia set rowcount


Saludos

[Microsoft MVP SQL Server]
SQLTOTALConsulting - Servicios y consultoria de SQLServer
www.sqlgurus.org
Buenos Aires - Argentina
http://msmvps.com/blogs/maxiaccotto/
"Vicente Flich" (quitar 99)> wrote in message
news:
> Hola de nuevo a todos:
>
> Necesito resolver un problema mas... Desde mi aplicacion ODBC quiero


hacer
> un select con una clausula TOP variable dependiendo de otra consulta.
>
> Me explico mejor con un ejemplo, de una tabla de facturas por ejemplo,


en
> la
> que pueden haber logicamente varios registros de un mismo cliente. Pues
> quiero recuperar con un select todas las facturas de un cliente
> determinado
> mas 1 (la del siguiente cliente ordenado por cliente. Por ejemplo de los
> siguientes registros:
>
> CLIENTE,FACTURA
> 001,fra.1
> 001,fra.2
> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25
> 004,fra33
>
> Quiero un select para recuperar los registros del cliente 002 ademas de


la
> primera factura del siguiente cliente, osea:
>
> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25
>
> He intentado algo como:
>
> SELECT *
> TOP((SELECT COUNT(*)FROM FACTURAS WHERE CLIENTE='002') + 1)
> FROM FACTURAS
> WHERE CLIENTE>='002'
> ORDER BY CLIENTE
>
> Seguramente sea una burrada, pero se entiende no? Por supuesto no


funciona
> :-(
>
> Finalmente, lo he resuelto con 2 llamadas al ODBC desde mi aplicacion:
> primero saco el count con:
> SELECT COUNT(*) FROM FACTURAS WHERE CLIENTE='002'
> y luego otra llamada a ODBC con:
> SELECT TOP(n+1)FROM FACTURAS WHERE CLIENTE>='002' ORDER BY CLIENTE
>
> Asi si que funciona logicamente, pero al ser 2 llamadas por ODBC va mas
> lento, por eso busco una sentencia SELECT que lo haga todo a la vez...
>
> Otra posibilidad que se me ocurre es desarrollar un stored procedure,
> aunque
> preferiria la sentencia SELECT.
>
> ¿Alguien puede orientarme?
>
> Saludos,
> Vicente Flich
>
>
>



Respuesta Responder a este mensaje
#7 Jose Mariano Alvarez
18/03/2007 - 20:12 | Informe spam
Cualquier cosa que hagas hace al menos dos accesos a la tabla.




Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




"Vicente Flich" (quitar 99)> wrote in message
news:
Es en SQL 2005. Pero no entiendo lo del to(@variable). Primero deberia
asignar la variable con otra consulta, cosa que es lo que quiero evitar.

Saludos,
Vicente Flich

"Maxi" escribió en el mensaje
news:uSQ2%
Hola, en sql2000 no se oermiten este tipo de operaciones pero en 2005 si,

select top(@variable) from tabla

Si usas 2000 o bien tenes que hacer lo que te comentaron en el post


antrior
o sino usar SQL-dinamico sp_executesql o sino tambien podes trabajar con


la
sentencia set rowcount


Saludos

[Microsoft MVP SQL Server]
SQLTOTALConsulting - Servicios y consultoria de SQLServer
www.sqlgurus.org
Buenos Aires - Argentina
http://msmvps.com/blogs/maxiaccotto/
"Vicente Flich" (quitar 99)> wrote in message
news:
> Hola de nuevo a todos:
>
> Necesito resolver un problema mas... Desde mi aplicacion ODBC quiero


hacer
> un select con una clausula TOP variable dependiendo de otra consulta.
>
> Me explico mejor con un ejemplo, de una tabla de facturas por ejemplo,


en
> la
> que pueden haber logicamente varios registros de un mismo cliente. Pues
> quiero recuperar con un select todas las facturas de un cliente
> determinado
> mas 1 (la del siguiente cliente ordenado por cliente. Por ejemplo de
> los
> siguientes registros:
>
> CLIENTE,FACTURA
> 001,fra.1
> 001,fra.2
> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25
> 004,fra33
>
> Quiero un select para recuperar los registros del cliente 002 ademas de


la
> primera factura del siguiente cliente, osea:
>
> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25
>
> He intentado algo como:
>
> SELECT *
> TOP((SELECT COUNT(*)FROM FACTURAS WHERE CLIENTE='002') + 1)
> FROM FACTURAS
> WHERE CLIENTE>='002'
> ORDER BY CLIENTE
>
> Seguramente sea una burrada, pero se entiende no? Por supuesto no


funciona
> :-(
>
> Finalmente, lo he resuelto con 2 llamadas al ODBC desde mi aplicacion:
> primero saco el count con:
> SELECT COUNT(*) FROM FACTURAS WHERE CLIENTE='002'
> y luego otra llamada a ODBC con:
> SELECT TOP(n+1)FROM FACTURAS WHERE CLIENTE>='002' ORDER BY CLIENTE
>
> Asi si que funciona logicamente, pero al ser 2 llamadas por ODBC va mas
> lento, por eso busco una sentencia SELECT que lo haga todo a la vez...
>
> Otra posibilidad que se me ocurre es desarrollar un stored procedure,
> aunque
> preferiria la sentencia SELECT.
>
> ¿Alguien puede orientarme?
>
> Saludos,
> Vicente Flich
>
>
>








Respuesta Responder a este mensaje
#8 Jose Mariano Alvarez
18/03/2007 - 20:13 | Informe spam
Quedo cuando copie y peque la consulta.
Solo por ese campo no tiene sentido. Es verdad.



Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)




wrote in message
news:

cual es el sentido de ordenar un conjunto de resultados por un campo
que tiene un unico valor??
WHERE CLIENTE = '002'
ORDER BY CLIENTE

saludos!
diego

On 17 mar, 12:47, "Jose Mariano Alvarez"
wrote:
Prueba esto

SELECT *
FROM FACTURAS
WHERE CLIENTE = '002'
ORDER BY CLIENTE
union all
SELECT TOP 1 *
FROM FACTURAS
WHERE CLIENTE > '002'
ORDER BY CLIENTE


Saludos
Ing. Jose Mariano Alvarez


(Cambia los ceros por O y saca lo que sobra)

"Vicente Flich" (quitar 99)> wrote in
messagenews:



> Hola de nuevo a todos:

> Necesito resolver un problema mas... Desde mi aplicacion ODBC quiero
> hacer
> un select con una clausula TOP variable dependiendo de otra consulta.

> Me explico mejor con un ejemplo, de una tabla de facturas por ejemplo,
> en
> la
> que pueden haber logicamente varios registros de un mismo cliente. Pues
> quiero recuperar con un select todas las facturas de un cliente
> determinado
> mas 1 (la del siguiente cliente ordenado por cliente. Por ejemplo de los
> siguientes registros:

> CLIENTE,FACTURA
> 001,fra.1
> 001,fra.2
> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25
> 004,fra33

> Quiero un select para recuperar los registros del cliente 002 ademas de
> la
> primera factura del siguiente cliente, osea:

> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25

> He intentado algo como:

> SELECT *
> TOP((SELECT COUNT(*)FROM FACTURAS WHERE CLIENTE='002') + 1)
> FROM FACTURAS
> WHERE CLIENTE>='002'
> ORDER BY CLIENTE

> Seguramente sea una burrada, pero se entiende no? Por supuesto no
> funciona
> :-(

> Finalmente, lo he resuelto con 2 llamadas al ODBC desde mi aplicacion:
> primero saco el count con:
> SELECT COUNT(*) FROM FACTURAS WHERE CLIENTE='002'
> y luego otra llamada a ODBC con:
> SELECT TOP(n+1)FROM FACTURAS WHERE CLIENTE>='002' ORDER BY CLIENTE

> Asi si que funciona logicamente, pero al ser 2 llamadas por ODBC va mas
> lento, por eso busco una sentencia SELECT que lo haga todo a la vez...

> Otra posibilidad que se me ocurre es desarrollar un stored procedure,
> aunque
> preferiria la sentencia SELECT.

> ¿Alguien puede orientarme?

> Saludos,
> Vicente Flich- Ocultar texto de la cita -

- Mostrar texto de la cita -
Respuesta Responder a este mensaje
#9 Maxi
19/03/2007 - 00:33 | Informe spam
Un ejemplo:

Declare @n int
set @n = 15

select top (@n) * from tutabla


"Vicente Flich" (quitar 99)> escribió en el mensaje
de noticias news:
Es en SQL 2005. Pero no entiendo lo del to(@variable). Primero deberia
asignar la variable con otra consulta, cosa que es lo que quiero evitar.

Saludos,
Vicente Flich

"Maxi" escribió en el mensaje
news:uSQ2%
Hola, en sql2000 no se oermiten este tipo de operaciones pero en 2005 si,

select top(@variable) from tabla

Si usas 2000 o bien tenes que hacer lo que te comentaron en el post


antrior
o sino usar SQL-dinamico sp_executesql o sino tambien podes trabajar con


la
sentencia set rowcount


Saludos

[Microsoft MVP SQL Server]
SQLTOTALConsulting - Servicios y consultoria de SQLServer
www.sqlgurus.org
Buenos Aires - Argentina
http://msmvps.com/blogs/maxiaccotto/
"Vicente Flich" (quitar 99)> wrote in message
news:
> Hola de nuevo a todos:
>
> Necesito resolver un problema mas... Desde mi aplicacion ODBC quiero


hacer
> un select con una clausula TOP variable dependiendo de otra consulta.
>
> Me explico mejor con un ejemplo, de una tabla de facturas por ejemplo,


en
> la
> que pueden haber logicamente varios registros de un mismo cliente. Pues
> quiero recuperar con un select todas las facturas de un cliente
> determinado
> mas 1 (la del siguiente cliente ordenado por cliente. Por ejemplo de
> los
> siguientes registros:
>
> CLIENTE,FACTURA
> 001,fra.1
> 001,fra.2
> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25
> 004,fra33
>
> Quiero un select para recuperar los registros del cliente 002 ademas de


la
> primera factura del siguiente cliente, osea:
>
> 002,fra16
> 002,fra3
> 002,fra22
> 004,fra25
>
> He intentado algo como:
>
> SELECT *
> TOP((SELECT COUNT(*)FROM FACTURAS WHERE CLIENTE='002') + 1)
> FROM FACTURAS
> WHERE CLIENTE>='002'
> ORDER BY CLIENTE
>
> Seguramente sea una burrada, pero se entiende no? Por supuesto no


funciona
> :-(
>
> Finalmente, lo he resuelto con 2 llamadas al ODBC desde mi aplicacion:
> primero saco el count con:
> SELECT COUNT(*) FROM FACTURAS WHERE CLIENTE='002'
> y luego otra llamada a ODBC con:
> SELECT TOP(n+1)FROM FACTURAS WHERE CLIENTE>='002' ORDER BY CLIENTE
>
> Asi si que funciona logicamente, pero al ser 2 llamadas por ODBC va mas
> lento, por eso busco una sentencia SELECT que lo haga todo a la vez...
>
> Otra posibilidad que se me ocurre es desarrollar un stored procedure,
> aunque
> preferiria la sentencia SELECT.
>
> ¿Alguien puede orientarme?
>
> Saludos,
> Vicente Flich
>
>
>








email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida