Consulta Sencilla pero compleja.

14/04/2010 - 10:20 por 4234234 | Informe spam
Hola,

tengo dos tablas para gestionar el personal.

t_personal (listado de gente con su nombre y otros datos personales)
id_personal
nombre_personal
...etc

t_periodos_personal (periodos de actividad de la gente, con la
categoria y funcion que desempeño en ese período, que no siempre es el
mismo)
fk_periodo_personal_persona,
fk_periodo_personal_categoria,
fk_periodo_personal_funcion,
y el período: fk_periodo_personal_desde y fk_periodo_personal_hasta.

Pues bien, me interesa sacar un listado de toda la gente, con la
última funcion y categoria que tuvo, y solo se hacerlo con esta
consulta, la cual veo muy compleja para lo que quiero ¿no?

gracias

SELECT TOP (100) PERCENT id_personal AS Chequeo, personal_nombre
AS Nombre,
(SELECT TOP (1)
fk_periodo_personal_categoria
FROM dbo.t_periodos_personal
WHERE (fk_periodo_personal_persona dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Categoria,
(SELECT TOP (1)
fk_periodo_personal_funcion
FROM dbo.t_periodos_personal AS
t_periodos_personal_1
WHERE (fk_periodo_personal_persona dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Funcion
FROM dbo.t_personal
ORDER BY Chequeo
 

Leer las respuestas

#1 Alejandro Mesa
14/04/2010 - 14:41 | Informe spam
La sentencia devolvera lo que deseas pero de una forma costosa, pues por cada
persona evaluara dos consultas correlacionadas que a la final apuntan a la
misma fila en la tabla [t_periodos_personal].

Cual version de SQL Server usas?

Aqui tienes una posible solucion, pero usa facilidades introducidas en SS
2005, que son CTE y funciones de rangos.

WITH r_set AS (
SELECT
p.id_personal AS Chequeo,
p.personal_nombre AS Nombre,
p.chequeo,
pp.fk_periodo_personal_categoria AS Categoria,
pp.fk_periodo_personal_funcion AS Funcion,
ROW_NUMBER() OVER(PARTITION BY p.id_personal ORDER BY
pp.fk_periodo_personal_desde DESC) AS rn
FROM
dbo.t_personal AS p
INNER JOIN
dbo.t_periodos_personal AS pp
ON pp.fk_periodo_personal_persona = p.id_personal
)
SELECT
Chequeo,
Nombre,
Categoria,
Funcion
FROM
r_set
WHERE
rn = 1
ORDER BY
Chequeo;
GO


AMB


"4234234" wrote:

Hola,

tengo dos tablas para gestionar el personal.

t_personal (listado de gente con su nombre y otros datos personales)
id_personal
nombre_personal
etc

t_periodos_personal (periodos de actividad de la gente, con la
categoria y funcion que desempeño en ese período, que no siempre es el
mismo)
fk_periodo_personal_persona,
fk_periodo_personal_categoria,
fk_periodo_personal_funcion,
y el período: fk_periodo_personal_desde y fk_periodo_personal_hasta.

Pues bien, me interesa sacar un listado de toda la gente, con la
última funcion y categoria que tuvo, y solo se hacerlo con esta
consulta, la cual veo muy compleja para lo que quiero ¿no?

gracias

SELECT TOP (100) PERCENT id_personal AS Chequeo, personal_nombre
AS Nombre,
(SELECT TOP (1)
fk_periodo_personal_categoria
FROM dbo.t_periodos_personal
WHERE (fk_periodo_personal_persona > dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Categoria,
(SELECT TOP (1)
fk_periodo_personal_funcion
FROM dbo.t_periodos_personal AS
t_periodos_personal_1
WHERE (fk_periodo_personal_persona > dbo.t_personal.id_personal)
ORDER BY fk_periodo_personal_persona,
periodo_personal_hasta DESC) AS Funcion
FROM dbo.t_personal
ORDER BY Chequeo
.

Preguntas similares