Cursor vs Consultas

05/09/2005 - 20:25 por Tumba | Informe spam
Hola, buenas tardes, necesito ayuda por favor!!!, tengo un problema con un
Stored que usa cursores para hacer unos calculos que quiero reformular con
operaciones de conjunto.

Se trata de una Tabla te tiene rangos de fechas en los cuales un Docente a
trabajado

Ej:

IdFecha | FechaAlta | FechaBaja | Cargo | Escuela

1 | 10/10/1978 | 13/12/1978 | UEF | 1

2 | 10/11/1978 | 13/12/1978 | UEF | 2

3 | 10/10/1978 | 13/12/1988 | UEF | 3

4 | 10/10/1989 | 13/12/1989 | UEF | 1

5 | 10/10/1990 | 13/12/1991 | UEF | 1

6 | 10/12/1990 | 13/12/1992 | UEF | 3



el Stored usa cursores para tomar los rangos que un docente trabajo en un
cargo concatenando los rangos que estan superpuesto y eliminando los rangos
incluidos el resultado que devuelve el SP es el siguiente:



Rango | FechaAlta | FechaBaja | Cargo

1 | 10/10/1978 | 13/12/1988 | UEF

4 | 10/10/1989 | 13/12/1989 | UEF

5 | 10/10/1990 | 13/12/1992 | UEF



He logrado resolverlo con consultas anidadas sobre la tabla de fechas, pero
mi solucion no me convence ya que demora mas tiempo que el cursor y la logica
para entenderla es complicada.

Explico como lo resolvi para ver si a alguien se le ocurre una mejor manera.

Cree una Consulta que identifica los Incluidos (rangos que estan dentro de
otro)

Otra que identifica a los que InicianDentro (que no estan en Incluidos)

Otra que identifica a los que TerminanDentro.

Otra que Identifica a los que InicianRango (de los concatenados, son los que
Finalizan dentro que no estan en InicianDentro)

Otra que Identifica a los que FinalizanRango (de los concatenados, son los
que Inicializan dentro que no estan en FinalizanDentro)

Otra RangosJuntos que Junta los InicianRango con los Finalizan Rango

Otra consulta que obtiene los Rangos libres

y Una Final que hace la union de Rangos Libres y RangosJuntos.



Cabe aclarar que la tabla de fechas tiene 600.000 registros



Agradezco mucho cualquier aporte a la causa de antemano
 

Leer las respuestas

#1 Alejandro Mesa
05/09/2005 - 22:05 | Informe spam
Trata:

create table t1(
IdFecha int not null identity primary key,
FechaAlta datetime not null,
FechaBaja datetime not null,
Cargo char(3) not null,
Escuela int not null
)

insert into t1(FechaAlta, FechaBaja, Cargo, Escuela)
values('19781010', '19781213', 'UEF', 1)

insert into t1(FechaAlta, FechaBaja, Cargo, Escuela)
values('19781110', '19781213', 'UEF', 2)

insert into t1(FechaAlta, FechaBaja, Cargo, Escuela)
values('19781010', '19881213', 'UEF', 3)

insert into t1(FechaAlta, FechaBaja, Cargo, Escuela)
values('19891010', '19891213', 'UEF', 1)

insert into t1(FechaAlta, FechaBaja, Cargo, Escuela)
values('19901010', '19911213', 'UEF', 1)

insert into t1(FechaAlta, FechaBaja, Cargo, Escuela)
values('19901210', '19921213', 'UEF', 3)
go

create view v1
as
select
isnull(
(
select
min(b.IdFecha)
from
t1 as b
where
b.IdFecha < a.IdFecha
and
(
a.FechaAlta between b.FechaAlta and b.FechaBaja
or
a.FechaBaja between b.FechaAlta and b.FechaBaja
)
), a.IdFecha) as Rango,
IdFecha,
FechaAlta,
FechaBaja,
Cargo
from
t1 as a
go

select
rango,
min(fechaalta) as fecha_alta,
max(fechabaja) as fecha_baja,
min(cargo) as cargo
from
v1
group by
rango
order by
rango
go

drop view v1
go

drop table t1
go


AMB

"Tumba" wrote:

Hola, buenas tardes, necesito ayuda por favor!!!, tengo un problema con un
Stored que usa cursores para hacer unos calculos que quiero reformular con
operaciones de conjunto.

Se trata de una Tabla te tiene rangos de fechas en los cuales un Docente a
trabajado

Ej:

IdFecha | FechaAlta | FechaBaja | Cargo | Escuela

1 | 10/10/1978 | 13/12/1978 | UEF | 1

2 | 10/11/1978 | 13/12/1978 | UEF | 2

3 | 10/10/1978 | 13/12/1988 | UEF | 3

4 | 10/10/1989 | 13/12/1989 | UEF | 1

5 | 10/10/1990 | 13/12/1991 | UEF | 1

6 | 10/12/1990 | 13/12/1992 | UEF | 3



el Stored usa cursores para tomar los rangos que un docente trabajo en un
cargo concatenando los rangos que estan superpuesto y eliminando los rangos
incluidos el resultado que devuelve el SP es el siguiente:



Rango | FechaAlta | FechaBaja | Cargo

1 | 10/10/1978 | 13/12/1988 | UEF

4 | 10/10/1989 | 13/12/1989 | UEF

5 | 10/10/1990 | 13/12/1992 | UEF



He logrado resolverlo con consultas anidadas sobre la tabla de fechas, pero
mi solucion no me convence ya que demora mas tiempo que el cursor y la logica
para entenderla es complicada.

Explico como lo resolvi para ver si a alguien se le ocurre una mejor manera.

Cree una Consulta que identifica los Incluidos (rangos que estan dentro de
otro)

Otra que identifica a los que InicianDentro (que no estan en Incluidos)

Otra que identifica a los que TerminanDentro.

Otra que Identifica a los que InicianRango (de los concatenados, son los que
Finalizan dentro que no estan en InicianDentro)

Otra que Identifica a los que FinalizanRango (de los concatenados, son los
que Inicializan dentro que no estan en FinalizanDentro)

Otra RangosJuntos que Junta los InicianRango con los Finalizan Rango

Otra consulta que obtiene los Rangos libres

y Una Final que hace la union de Rangos Libres y RangosJuntos.



Cabe aclarar que la tabla de fechas tiene 600.000 registros



Agradezco mucho cualquier aporte a la causa de antemano


Preguntas similares