SQL - CONSULTA DIFICIL

 
Vista:

CONSULTA DIFICIL

Publicado por Angel Fernando (1 intervención) el 15/09/2010 22:30:17
Buenas tardes, ojala me puedan ayuadr:
Tengo dos tablas:
alumnos y asignaciones.

*alumnos
matricula
nombre

* asignaciones
matricula
periodo

Con los siguientes registros agregados:
* alumnos:
1 - Angel
2- Carlos
3 - Luis
4 - Pepe
5 - Juan

* asignaciones
1 - 1
1 - 2
2 - 1
3 - 1

Necesito que la consulta me despliegue TODOS los alumnos que NO se encuentren en asignaciones con periodo = 2
*Es decir, me debiera desplegar:
2 - Carlos
3 - Luis
4 - Pepe
5 - Juan

Nota: Angel NO porque se encuentra asignado en el periodo 2 en asignaciones.
Aparece Pepe y Juan porque nunca han sido asignados (ni al periodo 1 ni al 2)

Tengo esta consulta:

SELECT alumnos.matricula,
alumnos.nombre,
FROM alumnos LEFT JOIN asignaciones ON (alumnos.matricula = asignaciones.matricula)
WHERE (asignaciones.matricula) IS NULL
ORDER BY alumnos.matricula

Pero solo me muestra
4 - Pepe
5 - Juan

Es decir, los que no han sido nunca asignados.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

RE:CONSULTA DIFICIL

Publicado por Leonardo Josué (1173 intervenciones) el 20/09/2010 17:55:19
Buenos días Angel Fernando. Mira, estoy checando tu consulta y hay varios detalles a conciderar:

1. en ningún lugar estás filtrando los registros que tienen el periodo 2
2. no puedes utilizar el LEFT JOIN, ya que por ejemplo el registro para ANGEL con el periodo 1 permanecería.

Hay otra manera para obtener lo que necesitas y que es utilizando subconsultas. En primer lugar obtienes todos las matrículas que tienes que excluir de tu consulta así:

SELECT distinct matricula FROM asignaciones WHERE periodo = 2

con esta consulta obtienes que la única matrícula que no debe aparecer en tu listado final es la 2. ahora bien, lo único que tienes que hacer es una select a tu tabla de alumnos excluyendo el resultado anterior. más o menos quedaría así:

SELECT * FROM alumnos WHERE matricula NOT IN
(
SELECT distinct matricula FROM asignaciones WHERE periodo = 2
)

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar