SQL - Al hacer un Inner join repite valores!

 
Vista:

Al hacer un Inner join repite valores!

Publicado por Juan Carlos (3 intervenciones) el 18/07/2017 23:31:21
buenas tardes,

me pasa que necesito tomar valores de tres distintas tablas, dichas tres tablas. llamemos las:

tbl_a

id Site Valor_a
1 co 111
2 co 222
3 co 333

tbl_b

id Site Valor_b
1 co 444
2 co 555
3 co 666

tbl_c

id Site Valor_c
1 co 777
2 co 888
3 co 999


en todas estas tablas tienen una columna en común llamada Site


con mi consulta necesito que me traiga los valores de Valor_a , Valor_b , Valor_c en donde Site = 'co';

algo asi

Valor_a Valor_b Valor_c
111 444 777
222 555 888
333 666 999


yaaa!


en vez de eso me sale tal que así:


Valor_a Valor_b Valor_c
111 444 777
222 444 777
333 444 777
111 555 777
222 555 777
333 555 777
111 666 777
222 666 777
333 666 777 etc etc etc....


La consulta que utilizo es la siguiente:

1
2
3
4
SELECT tbl_a.Valor_a, tbl_b.Valor_b, tbl_c.Valor_c
FROM tbl_a
INNER JOIN tbl_b ON tbl_a.Site = tbl_b.Site
INNER JOIN tbl_c ON tbl_a.Site = tbl_c.Site WHERE tbl_a.Site = 'co' AND tbl_b.Site = 'co' AND tbl_c.Site = 'co';


no se si tiene algo que ver con llaves... no tengo idea ya de como hacer que funcione, si alguien me puede ayudar seria de gran ayuda. agradezco el tiempo por atender esta petición
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
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Al hacer un Inner join repite valores!

Publicado por Isaias (1921 intervenciones) el 19/07/2017 00:53:59
Seria de gran ayuda que nos dijeras en que motor de base de datos estas trabajando.
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

Al hacer un Inner join repite valores!

Publicado por Juan Carlos (3 intervenciones) el 19/07/2017 00:56:44
Estoy desde mysql
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Al hacer un Inner join repite valores!

Publicado por leonardo_josue (1173 intervenciones) el 19/07/2017 17:11:24
Hola Juan Carlos...

Lo que tienes es perfectamente normal y se llama PRODUCTO CARTESIANO, y en realidad no es que tengas algo "mal", sino que te faltan algunos criterios en la consulta...

Tú estás considerando sólo el campo site, y resulta que todos tienen el mismo valor...

en tu ejemplo dices que quieres obtener esto como salida:

1
2
3
4
Valor_a Valor_b Valor_c
111 444 777
222 555 888
333 666 999

¿pero cómo hiciste para unir el valor 111 sólo con el valor 444 y sólo con el valor 777? es decir, todas los registros cumplen con la condición de que el site sea el mismo, por lo tanto el 111 se puede combinar tanto con el 444, el 555 y el 666... eso es justamente un producto cartesiando...

Para resolver esto, ocupas una condición adicional para unir sólo los registros que te interesan... para tus datos de ejemplo, podrías agregar la condición del ID:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
mysql> SELECT * FROM tbl_a;
+------+------+---------+
| id   | site | valor_a |
+------+------+---------+
|    1 | co   |     111 |
|    2 | co   |     222 |
|    3 | co   |     333 |
+------+------+---------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tbl_b;
+------+------+---------+
| id   | site | valor_b |
+------+------+---------+
|    1 | co   |     444 |
|    2 | co   |     555 |
|    3 | co   |     666 |
+------+------+---------+
3 rows in set (0.02 sec)
 
mysql> SELECT * FROM tbl_c;
+------+------+---------+
| id   | site | valor_c |
+------+------+---------+
|    1 | co   |     777 |
|    2 | co   |     888 |
|    3 | co   |     999 |
+------+------+---------+
3 rows in set (0.00 sec)
 
mysql> SELECT tbl_a.Valor_a, tbl_b.Valor_b, tbl_c.Valor_c
    -> FROM tbl_a
    -> INNER JOIN tbl_b ON tbl_a.Site = tbl_b.Site
    ->                     AND tbl_a.id = tbl_b.id
    -> INNER JOIN tbl_c ON tbl_a.Site = tbl_c.Site
    ->                     AND tbl_a.id = tbl_c.id
    -> WHERE tbl_a.Site = 'co'
    ->   AND tbl_b.Site = 'co'
    ->   AND tbl_c.Site = 'co';
+---------+---------+---------+
| Valor_a | Valor_b | Valor_c |
+---------+---------+---------+
|     111 |     444 |     777 |
|     222 |     555 |     888 |
|     333 |     666 |     999 |
+---------+---------+---------+
3 rows in set (0.02 sec)

Ahora, supongo que estos datos de ejemplo no se parecen a tus datos reales, por lo que es posible que la consulta como tal no funcione, pero la idea sigue siendo encontrar una condición que te una de manera 1 a 1 los registros entre tus tablas.

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
0
Comentar

Al hacer un Inner join repite valores!

Publicado por Juan Carlos (3 intervenciones) el 19/07/2017 21:44:27
Muchas gracias Leonardo,

Me parece excelente tu explicación,
Si en efecto los datos reales que uso son muchos mas, pero estos de ejemplos eran para explicar mi problema/idea mas fácil mente, a lo mejor en mi herramienta tomare la columna "DateAndTime" para que sea el punto de comparación 1 a 1, ya que en todas las filas tienen una fecha y hora única en cada tabla.


Espero que este material también le funcione a demás personas que puedan tener el problema. ya que, investigue antes de abrir este foro. y en ningún lado había solución o demostración de una manera limpia y asertiva.

PD: Lo probé y funcionó
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