SQL - Ayuda con una Consulta

 
Vista:
sin imagen de perfil

Ayuda con una Consulta

Publicado por Cristian Ramirez (2 intervenciones) el 06/10/2014 03:35:01
Necesito hacer una consulta donde muestre a los alumnos con su seccion. Pero el problema es que un alumno puede tener 2 secciones una Academica y otra Tecnica, y para eso hice una tabla donde esta el idSeccion y el idAlumno. y esta probando hacer esto :
SELECT D.idAlumno 'ID', A.nombre 'Nombres', A.apellido 'Apellidos', S.codigoSeccion 'Codigo Tecnico',
(SELECT S.codigoSeccion FROM Seccion S WHERE D.idAlumno = A.idAlumno AND S.codigoSeccion = 'PE5DM') 'Codigo Academico'
FROM DetalleSeccion D INNER JOIN Alumno A ON D.idAlumno = A.idAlumno
INNER JOIN Seccion S ON S.idSeccion = D.idSeccion

Pero como e dicho el alumno puede tener 2 secciones y si tengo ingresados 2 alumnos me salen 4 registros (2 duplicados) con la seccion.
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

Ayuda con una Consulta

Publicado por leonardo_josue (1173 intervenciones) el 06/10/2014 20:11:47
Hola Cristian Ramirez:

Creo entender el problema, sin embargo no me que queda del todo claro cómo quieres presentar tus resultados. Vayamos por partes.

En primer lugar, no mencionas con qué motor de BD's estás trabajando, este dato es muy importante, pues aunque la mayoría de los DBMS's están basados en SQL, existen diferencias sintácticas muy importantes entre cada uno de ellos.

En segundo lugar, no nos dejas de manera clara la estructura de tus tablas, ni tampoco muestras algunos datos de ejemplo. Esto es muy importante para saber cómo están relacionadas y ver si el problema es por alguna relación que esté ocasionando un producto cartesiano, es más sencillo entender un modelo de BD's con datos que tratar de adivinarlo a partir de la consulta que pones.

Con respecto a los datos, ¿cómo distingues que una sección es de tipo ACADÉMICA o TÉCNICA), puedo suponer que cuando haces el filtro de S.codigoSeccion = 'PE5DM' es para distinguir esto, pero insisto, eso sólo Dios y Tú lo saben... no estoy haciendo otra cosa más que tratar de adivinar lo que intentas hacer...

Ahora bien, creo suponer donde está el problema y es que estás tratando de asociar una relación 1 a muchos en un solo registro... lo que intentas hacer creo que es correcto, sin embargo al hacer JOIN'S, la relación prevalece, por lo tanto se "duplican" los registros, pero veamos este ejemplo a ver si es más o menos lo que quieres hacer...

Supongamos que tienes estas tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mysql> SELECT * FROM alumnos;
+----------+--------+
| idAlumno | nombre |
+----------+--------+
|        1 | Hugo   |
|        2 | Paco   |
|        3 | Luis   |
+----------+--------+
3 rows in set (0.08 sec)
 
mysql> SELECT * FROM secciones;
+-----------+-------------------+
| idSeccion | descripcion       |
+-----------+-------------------+
|         1 | SECCION TECNICA   |
|         2 | SECCION ACADEMICA |
+-----------+-------------------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM alumnos_secciones;
+-----------------+----------+-----------+
| idAlumnoSeccion | idAlumno | idSeccion |
+-----------------+----------+-----------+
|               1 |        1 |         1 |
|               2 |        2 |         2 |
|               3 |        3 |         1 |
|               4 |        3 |         2 |
+-----------------+----------+-----------+
4 rows in set (0.11 sec)

De aquí se infiere que el alumno HUGO sólo tiene una sección TÉCNICA, el alumno PACO sólo tiene una sección ACADEMICA, y el alumno LUIS tiene AMBAS secciones...

Si quisieras presentar la información de cada alumno EN UN SOLO REGISTRO, podrías hacerlo con subconsultas, en MySQL podrías hacerlo más o menos así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> SELECT T1.idAlumno, T1.nombre,
    -> ( SELECT T3.descripcion
    ->   FROM alumnos_secciones T2, secciones T3
    ->   WHERE T2.idSeccion = T3.idSeccion AND
    ->  T1.idAlumno = T2.idAlumno AND
    ->         T2.idSeccion = 1) seccion_tecnica,
    -> ( SELECT T3.descripcion
    ->   FROM alumnos_secciones T2, secciones T3
    ->   WHERE T2.idSeccion = T3.idSeccion AND
    ->  T1.idAlumno = T2.idAlumno AND
    ->         T2.idSeccion = 2) seccion_academica
    -> FROM alumnos T1;
+----------+--------+-----------------+-------------------+
| idAlumno | nombre | seccion_tecnica | seccion_academica |
+----------+--------+-----------------+-------------------+
|        1 | Hugo   | SECCION TECNICA | NULL              |
|        2 | Paco   | NULL            | SECCION ACADEMICA |
|        3 | Luis   | SECCION TECNICA | SECCION ACADEMICA |
+----------+--------+-----------------+-------------------+
3 rows in set (0.00 sec)


Cabe hacer mención que es mejor utilizar JOIN's en lugar de listar las tablas en el FROM, sin embargo, MySQL no te permite hacer uso de estos si quieres también utilizar la tabla "externa", observa que las subconsultas SÓLO CAMBIAN EN EL FILTRO WHERE, en el primer caso filtro para que se consulten las tablas con idSeccion = 1 (que corresponden a las TECNICAS) y en la segunda filtro las idSeccion = 2 (que son las TECNICAS).

Esta es sólo una forma para resolverla, pero en absoluto es la mejor... hay otras maneras para hacer esto mismo, sin embargo insisto en que depende mucho del motor que estás utilizando y cómo tienes tu información relacionada. Si esto no te sirve, trata de explicarte un poco mejor y con gusto tratamos de ayudarte.

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
2
Comentar
sin imagen de perfil

Ayuda con una Consulta

Publicado por Cristian (2 intervenciones) el 07/10/2014 23:48:13
Gracias es exactamente lo que queria hacer .. me entendiste aunque tienes razon no me explique bien ... ahora el motor es MSSQL .. ahora mismo lo hire a hacer .. Gracias por Responder :)
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