SQL - Consulta con valores duplicados

 
Vista:
sin imagen de perfil
Val: 4
Ha disminuido su posición en 9 puestos en SQL (en relación al último mes)
Gráfica de SQL

Consulta con valores duplicados

Publicado por Juan Carlos (2 intervenciones) el 07/03/2018 20:31:25
Hola Buenas
Tengo una duda sobre la consulta siguiente
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
SELECT  Prof.asNb
     FROM
     eAlumno as AL,
     eAsignatura as ASG,
     eIdioma as I,
     eLocalidad as Loc,
     eProfesor as Prof,
     eProvincia as Prov,
     eProvincia as Provprof,
     eUniversidad as Uni,
     rAlumnoProfesorAsignatura as AlProfAsg
 
     WHERE
     (Loc.xProvincia=Prof.k) AND
     (Uni.xLocalidad=Loc.k)  AND
     (Uni.xIdioma=I.K) AND
     (Al.xUniversidad=Uni.k) AND
     (Prof.xProvinciaNacimiento=Provprof.k) AND
     (AlProfAsg.xAlumno=Al.k) AND
     (AlProfAsg.xProfesor=Prof.k) AND
     (AlProfAsg.xAsignatura=ASG.k)AND
     (PROVprof.asComunidad='MAdrid') AND
     (I.asIdioma='Chino') And
 
     (AlProfAsg.AdFEcha between '2000-09-01' and '2016-12-31');

Al ejecutarla, me devuelve el valor del profesor 3 veces ¿falta alguna relación? o ¿es lo que tiene que devolver?
Digo esto porque si estuviera bien , creo que solo apareceria una vez

Gracias
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

Consulta con valores duplicados

Publicado por Leonardo Josué (1172 intervenciones) el 07/03/2018 21:55:14
Hola Juan Carlos:

casi te puedo asegurar de que en realidad no tienes datos "duplicados" sino que simplemente tienes una relación 1 a muchos entre alguna de tus tablas... por ejemplo si un profesor tiene n alumnos y haces un join entre estas dos tablas, el profesor el nombre del profesor de repetirá n veces (tantas como alumnos tenga)



La forma más "sencilla" de darte cuenta de esto es hacer un SELECT * y ver qué campos son los distintos. Observa este ejemplo. Imagina 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
30
31
32
33
34
mysql> SELECT * FROM profesores;
+-------------+---------------+
| id_profesor | nombre        |
+-------------+---------------+
|           1 | profesor uno  |
|           2 | profesor dos  |
|           3 | profesor tres |
+-------------+---------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM alumnos;
+-----------+------------+
| id_alumno | nombre     |
+-----------+------------+
|         1 | alumno I   |
|         2 | alumno II  |
|         3 | alumno III |
|         4 | alumno IV  |
+-----------+------------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM grupos;
+----------+-------------+-----------+
| id_grupo | id_profesor | id_alumno |
+----------+-------------+-----------+
|        1 |           1 |         1 |
|        2 |           1 |         2 |
|        3 |           1 |         3 |
|        4 |           2 |         2 |
|        5 |           2 |         3 |
|        6 |           2 |         4 |
|        7 |           3 |         1 |
+----------+-------------+-----------+
7 rows in set (0.00 sec)

entonces, si haces JOIN's como tú lo estás haciendo y filtras sólo al profesor 2, obtienes esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT profesores.nombre
    -> FROM grupos
    -> INNER JOIN profesores    ON grupos.id_profesor = profesores.id_profesor
    -> INNER JOIN alumnos       ON grupos.id_alumno = alumnos.id_alumno
    -> WHERE profesores.id_profesor = 2;
+--------------+
| nombre       |
+--------------+
| profesor dos |
| profesor dos |
| profesor dos |
+--------------+
3 rows in set (0.00 sec)

que es exactamente el comportamiento que mencionas, pero si haces un SELECT * te darás que en realidad CADA REGISTRO ES DISTINTO:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT *
    -> FROM grupos
    -> INNER JOIN profesores    ON grupos.id_profesor = profesores.id_profesor
    -> INNER JOIN alumnos       ON grupos.id_alumno = alumnos.id_alumno
    -> WHERE profesores.id_profesor = 2;
+----------+-------------+-----------+-------------+--------------+-----------+------------+
| id_grupo | id_profesor | id_alumno | id_profesor | nombre       | id_alumno |nombre      |
+----------+-------------+-----------+-------------+--------------+-----------+------------+
|        4 |           2 |         2 |           2 | profesor dos |         2 |alumno II   |
|        5 |           2 |         3 |           2 | profesor dos |         3 |alumno III  |
|        6 |           2 |         4 |           2 | profesor dos |         4 |alumno IV   |
+----------+-------------+-----------+-------------+--------------+-----------+------------+
3 rows in set (0.00 sec)

Si sólo te interesa el dato en específico, as un SELECT DISTINCT para que sólo te muestre un resultado:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT DISTINCT profesores.nombre
    -> FROM grupos
    -> INNER JOIN profesores    ON grupos.id_profesor = profesores.id_profesor
    -> INNER JOIN alumnos       ON grupos.id_alumno = alumnos.id_alumno
    -> WHERE profesores.id_profesor = 2;
+--------------+
| nombre       |
+--------------+
| profesor dos |
+--------------+
1 row in set (0.00 sec)

Haz la prueba y nos comentas.

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
1
Comentar
sin imagen de perfil
Val: 4
Ha disminuido su posición en 9 puestos en SQL (en relación al último mes)
Gráfica de SQL

Consulta con valores duplicados

Publicado por Juan Carlos (2 intervenciones) el 07/03/2018 22:43:47
Muchas Gracias por la ayuda

Con Select Distinc funciona perfectamente y es una opcion que probe ,y como bien dices, no tengo el profesor duplicado , pero como se me repetia al sacar la consulta, tenia metido en la cabeza que estaba haciendo algo mal y me habia saltado alguna relacion.
Muchas Gracias por todo
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