2 select en 1 SP

17/08/2005 - 12:16 por Miquel | Informe spam
Hola,
Tengo un SP que hace 2 selects. Uno para una tabla de cabeceras, y otro para
una tabla de detalles. Esto es así, porque debo rellenar con ellos 2
datatables de ado.net.

Al SP se le pasan varios parametros para filtrar las cabeceras.
Lo que yo me pregunto, es si es posible desde dentro del sp, obtener los
registros de la tabla de detalle a partir de los registros filtrados de la
cabecera.

ejemplo:

alter procedure load_registros
@p int = null,
@p1 int = null,
..
@pn = null
as
//primer select: el de cabeceras filtrando
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2)


//segundo select: el de detalles (que debe cumplir los mismos filtros. O
sea, devolver solo el detalle para las cabeceras recuperadas para el primer
select

select det1, det2, det3, det4 from detalles
inner join
(
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2) ) cabecera
on detalle.det1 = cabecera.col1 and detalle.det2 = cabcera.col2

Así es como lo tengo.

Lo que me pregunto, es si hay alguna forma de evitar el tener que volver a
filtrar en el segundo select. Algo como poder, desde el sp, acceder a los
registros seleccionados por el priner select.

Grácias,
Miquel

Preguntas similare

Leer las respuestas

#1 Maxi
17/08/2005 - 13:51 | Informe spam
Hola, nop si lo quieres manejar asi!! otra forma seria hacer un solo Select
en lugar de 2 y saber que cosa va en cada uno o sea, no tener 2 dataset sino
uno por la entidad completa


Salu2
Maxi


"Miquel" escribió en el mensaje
news:
Hola,
Tengo un SP que hace 2 selects. Uno para una tabla de cabeceras, y otro
para
una tabla de detalles. Esto es así, porque debo rellenar con ellos 2
datatables de ado.net.

Al SP se le pasan varios parametros para filtrar las cabeceras.
Lo que yo me pregunto, es si es posible desde dentro del sp, obtener los
registros de la tabla de detalle a partir de los registros filtrados de la
cabecera.

ejemplo:

alter procedure load_registros
@p int = null,
@p1 int = null,
..
@pn = null
as
//primer select: el de cabeceras filtrando
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2)


//segundo select: el de detalles (que debe cumplir los mismos filtros. O
sea, devolver solo el detalle para las cabeceras recuperadas para el
primer
select

select det1, det2, det3, det4 from detalles
inner join
(
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2) ) cabecera
on detalle.det1 = cabecera.col1 and detalle.det2 = cabcera.col2

Así es como lo tengo.

Lo que me pregunto, es si hay alguna forma de evitar el tener que volver a
filtrar en el segundo select. Algo como poder, desde el sp, acceder a los
registros seleccionados por el priner select.

Grácias,
Miquel






Respuesta Responder a este mensaje
#2 Alejandro Mesa
17/08/2005 - 14:47 | Informe spam
Miguel,

Claro que existe otra forma, pero no te puedo asegurar si esta sera mas
eficiente. Puedes capturar el resultado de la primera sentencia select en una
tabla temporal o en caso de ser pocas filas, en una variable tipo tabla y
usar esta variable o tabla temporal para hacer la union con la tabla de
detalle. Fijate que ahora serian tres sentencias o mas.

create table #tmp()

insert into #tmp
select ... from t1 where ...

select * from #tmp
select t2.* from t2 inner join #tmp as t on ...

drop table #tmp
...

Debes probar ambas versiones y escojer la que mejor desempenio tenga. Yo me
inclinaria a usar tu version.


AMB

"Miquel" wrote:

Hola,
Tengo un SP que hace 2 selects. Uno para una tabla de cabeceras, y otro para
una tabla de detalles. Esto es así, porque debo rellenar con ellos 2
datatables de ado.net.

Al SP se le pasan varios parametros para filtrar las cabeceras.
Lo que yo me pregunto, es si es posible desde dentro del sp, obtener los
registros de la tabla de detalle a partir de los registros filtrados de la
cabecera.

ejemplo:

alter procedure load_registros
@p int = null,
@p1 int = null,
...
@pn = null
as
//primer select: el de cabeceras filtrando
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2)


//segundo select: el de detalles (que debe cumplir los mismos filtros. O
sea, devolver solo el detalle para las cabeceras recuperadas para el primer
select

select det1, det2, det3, det4 from detalles
inner join
(
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2) ) cabecera
on detalle.det1 = cabecera.col1 and detalle.det2 = cabcera.col2

Así es como lo tengo.

Lo que me pregunto, es si hay alguna forma de evitar el tener que volver a
filtrar en el segundo select. Algo como poder, desde el sp, acceder a los
registros seleccionados por el priner select.

Grácias,
Miquel







Respuesta Responder a este mensaje
#3 Miquel
17/08/2005 - 22:14 | Informe spam
Grácias por las respuestas.
Al final me he quedado con lo que tenia hecho. Es lo que más eficiente ha
resultado.

Miquel


"Miquel" escribió en el mensaje
news:
Hola,
Tengo un SP que hace 2 selects. Uno para una tabla de cabeceras, y otro


para
una tabla de detalles. Esto es así, porque debo rellenar con ellos 2
datatables de ado.net.

Al SP se le pasan varios parametros para filtrar las cabeceras.
Lo que yo me pregunto, es si es posible desde dentro del sp, obtener los
registros de la tabla de detalle a partir de los registros filtrados de la
cabecera.

ejemplo:

alter procedure load_registros
@p int = null,
@p1 int = null,
..
@pn = null
as
//primer select: el de cabeceras filtrando
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2)


//segundo select: el de detalles (que debe cumplir los mismos filtros. O
sea, devolver solo el detalle para las cabeceras recuperadas para el


primer
select

select det1, det2, det3, det4 from detalles
inner join
(
select col1, col2, col3, col4 from tabla where
(@p = null or @p = col1) and (@p1 is null or @p1 = col2) ) cabecera
on detalle.det1 = cabecera.col1 and detalle.det2 = cabcera.col2

Así es como lo tengo.

Lo que me pregunto, es si hay alguna forma de evitar el tener que volver a
filtrar en el segundo select. Algo como poder, desde el sp, acceder a los
registros seleccionados por el priner select.

Grácias,
Miquel






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