Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

Duda sobre consulta SQL anidada

Estas en el tema de Duda sobre consulta SQL anidada en el foro de Bases de Datos General en Foros del Web. Se me ha presentado un problema por una consulta que no logro hacer y no tengo la mas minima idea de como conseguir obtener los ...
  #1 (permalink)  
Antiguo 15/06/2007, 22:02
 
Fecha de Ingreso: enero-2006
Ubicación: Maracay, Edo. Aragua
Mensajes: 206
Antigüedad: 18 años, 3 meses
Puntos: 0
Duda sobre consulta SQL anidada

Se me ha presentado un problema por una consulta que no logro hacer y no tengo la mas minima idea de como conseguir obtener los resultados deseados.

Es un sistema de preinscripcion en linea para un colegio.

Fijense, tengo una tabla T_ALUMNOS y una tabla T_INSCRIPCION. En esta ultima se introducira como campo clave el ID del alumno, si "inscribo" al mismo en determinado grado o anyo.

Entonces, yo deberia mostrarle a los padres una lista de los alumnos que pueden inscribir, y la consulta seria algo asi:
Código PHP:
SELECT FROM alumno 
Pero que pasa, en esta lista yo no debo mostrar a los alumnos que ya estan inscritos, es decir, aquellos que estan en la tabla T_INSCRIPCIONES, y ahi es donde viene mi complicacion.

Por mas que le doy vueltas no se como sera la consulta, con un INNER JOIN no, no se si habra otra forma de hacer algo asi como dos consultas en una, es decir:
Código PHP:
SELECT FROM alumno WHERE NOT 
(SELECT FROM INSCRIPCION WHERE ALUMNO.id 1
Bueno, me imagino que esa consulta que coloque dara error, solo la puse para que entiendan mas o menos que es lo que quiero hacer.

Espero sus comentarios, saludos.

Última edición por BrujoNic; 15/06/2007 a las 22:25
  #2 (permalink)  
Antiguo 15/06/2007, 23:03
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 10 meses
Puntos: 24
Re: Duda sobre consulta SQL anidada

1) Un buen diseño de aplicación no usa asteriscos en los selects. Te recomiendo que SIEMPRE especifiques los campos que quieres recuperar.

2) No se que motor de BD usas, por lo que te doy la solución en SQL estándar
(SELECT atributos_alumno FROM ALUMNOS)
MINUS
(SELECT atributos_alumno FROM ALUMNOS INNER JOIN INSCRIPCION ON ALUMNOS.id = INSCRIPCION.id_alumno)

Otra forma puede ser:
SELECT atributos_alumno FROM ALUMNOS
WHERE NOT EXISTS
(SELECT atributos_inscripcion FROM INSCRIPCION WHERE INSCRIPCION.id_alumno=ALUMNOS.id)


La primera consulta hace uso del operador minus el cual permite hacer una diferencia entre 2 conjuntos de tuplas, en este caso recupero todos los alumnos y luego le quito todos los alumnos que ya están en la tabla inscripción. El inner join es necesario para obtener los datos del alumno ya que el operador minus requiere que la estructura de las tuplas sea idéntica.

La segunda consulta es "mas típica", la cual se traduce así: "Recuperar los alumnos de la tabla ALUMNOS solo si no existe su id en la tabla inscripciones".

Te recomiendo que no uses estas consultas directamente, probablemente no anden, las escribo solo para que te des una idea de la solución.
  #3 (permalink)  
Antiguo 16/06/2007, 09:26
 
Fecha de Ingreso: enero-2006
Ubicación: Maracay, Edo. Aragua
Mensajes: 206
Antigüedad: 18 años, 3 meses
Puntos: 0
De acuerdo Re: Duda sobre consulta SQL anidada

Excelente respuesta! Acabo de aplicar la segunda consulta y me funciono perfectamente, hace justo lo que necesito, ya voy a aplicar la otra para ver que tal. Muchisimas gracias, de verdad no tenia ni idea de que esto de relacionar dos tablas que no tuvieran ninguna conexion aparente se pudiera lograr con SQL.

Sobre las consultas con asterisco, ya lo se, nunca utilizo el asterisco, pero bueno, lo coloque para no complicar mas el ejemplo.

Saludos y una vez mas, mil gracias.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:59.