SQL - problema con query

 
Vista:

problema con query

Publicado por Carlos Vargas (3 intervenciones) el 12/04/2013 19:09:40
Tengo 3 tablas


F42119
(VENTAS)

1
2
3
4
5
6
SDAN8                VENTA                DESCR
-------------------- -------------------- --------------------
CLIENTE1             VENTA1               SULFATO
CLIENTE3             VENTA3               RESINA
CLIENTE2             VENTA2               CLORO
CLIENTE4             VENTA4               SOLUCION


F42140 (CLIENTES VS VENDEDOR)
1
2
3
4
5
6
CMAN8                CLSMS
-------------------- --------------------
CLIENTE1             VENDEDOR1
CLIENTE2             VENDEDOR2
CLIENTE3
CLIENTE4             VENDEDOR1


F0101(MESTRO DETALLE)

1
2
3
4
CLSMS                ABALPH
-------------------- --------------------
VENDEDOR1            PEPE
VENDEDOR2            JOSE


Debo mostrar las ventas que ha hecho cada vendedor, pero tambien mostrar las ventas que que no tienen asignado un vendedor

Esto lo he hecho asi:

1
2
3
SELECT SDAN8, VENTA, DESCR, T1.CLSMS, ABALPH
FROM F42119
INNER JOIN F42140 ON (sdan8 = cman8)


1
2
3
4
5
6
SDAN8                   VENTA                 DESCR                CLSMS
-------------------- -------------------- -------------------- --------------------
CLIENTE1             VENTA1               SULFATO              VENDEDOR1
CLIENTE2             VENTA2               CLORO                VENDEDOR2
CLIENTE3             VENTA3               RESINA
CLIENTE4             VENTA4               SOLUCION             VENDEDOR1


Pero ahora debo mostrar tambien el nombre del vendedor que esta en una tercera tabla
F0101.ABALPH

El resultado deberia quedar asi:(Pero no lo consigo, he usado left y right join)

1
2
3
4
5
6
SDAN8                VENTA                DESCR                CLSMS        ABALPH
-------------------- -------------------- -------------------- ----------- ----------
CLIENTE1             VENTA1               SULFATO              VENDEDOR1    PEPE
CLIENTE2             VENTA2               CLORO                VENDEDOR2    JOSE
CLIENTE3             VENTA3               RESINA
CLIENTE4             VENTA4               SOLUCION             VENDEDOR1    PEPE


Como debo hacer esta consulta?
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
Imágen de perfil de Isaias Islas Gonzalez
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

problema con query

Publicado por Isaias Islas Gonzalez (1921 intervenciones) el 12/04/2013 19:33:57
Solo estas agregando una columna mas a tu salida (ABALPH), ¿porque dices que no sale?

¿Que resultado te da?
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

problema con query

Publicado por Carlos Vargas (3 intervenciones) el 12/04/2013 21:28:04
Gracias por esponder

Asi he intentado hacerlo

1
2
3
4
SELECT SDAN8,VENTA,DESCR,T3.CLSMS,ABALPH
FROM F42119
INNER JOIN  F42140  ON (SDAN8=CMAN8),
F42140 LEFT JOIN F0101 T3 ON (T3.clsms= f42140.clsms)


y esto es l o que me muestra:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SDAN8                VENTA                DESCR                CLSMS                ABALPH
-------------------- -------------------- -------------------- -------------------- --------------------
CLIENTE1             VENTA1               SULFATO
CLIENTE1             VENTA1               SULFATO              VENDEDOR2            JOSE
CLIENTE1             VENTA1               SULFATO              VENDEDOR1            PEPE
CLIENTE1             VENTA1               SULFATO              VENDEDOR1            PEPE
CLIENTE3             VENTA3               RESINA
CLIENTE3             VENTA3               RESINA               VENDEDOR2            JOSE
CLIENTE3             VENTA3               RESINA               VENDEDOR1            PEPE
CLIENTE3             VENTA3               RESINA               VENDEDOR1            PEPE
CLIENTE2             VENTA2               CLORO
CLIENTE2             VENTA2               CLORO                VENDEDOR2            JOSE
CLIENTE2             VENTA2               CLORO                VENDEDOR1            PEPE
CLIENTE2             VENTA2               CLORO                VENDEDOR1            PEPE
CLIENTE4             VENTA4               SOLUCION
CLIENTE4             VENTA4               SOLUCION             VENDEDOR2            JOSE
CLIENTE4             VENTA4               SOLUCION             VENDEDOR1            PEPE
CLIENTE4             VENTA4               SOLUCION             VENDEDOR1            PEPE
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

problema con query

Publicado por leonardo_josue (1173 intervenciones) el 12/04/2013 21:47:09
Hola Carlos:

La idea que tienes es correcta, pero creo que estás equivocando el orden en el que haces los JOIN'S... además estás mezclando tablas separadas por comas, lo que está ocasionando un producto cartesiano entre tus tablas:

1
INNER JOIN  F42140  ON (SDAN8=CMAN8), F42140



checa este script:

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
mysql> SELECT * FROM F42119;
+----------+--------+----------+
| SDAN8    | VENTA  | DESCR    |
+----------+--------+----------+
| CLIENTE1 | VENTA1 | SULFATO  |
| CLIENTE3 | VENTA3 | RESINA   |
| CLIENTE2 | VENTA2 | CLORO    |
| CLIENTE4 | VENTA4 | SOLUCION |
+----------+--------+----------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM F42140;
+----------+-----------+
| CMAN8    | CLSMS     |
+----------+-----------+
| CLIENTE1 | VENDEDOR1 |
| CLIENTE2 | VENDEDOR2 |
| CLIENTE3 | NULL      |
| CLIENTE4 | VENDEDOR1 |
+----------+-----------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM F0101;
+-----------+--------+
| CLSMS     | ABALPH |
+-----------+--------+
| VENDEDOR1 | PEPE   |
| VENDEDOR2 | JOSE   |
+-----------+--------+
2 rows in set (0.00 sec)
 
mysql> SELECT * FROM F42140 T1
    -> INNER JOIN F42119 T2 ON T2.SDAN8 = T1.CMAN8
    -> LEFT JOIN F0101 T3 ON T3.CLSMS = T1.CLSMS;
+----------+-----------+----------+--------+----------+-----------+--------+
| CMAN8    | CLSMS     | SDAN8    | VENTA  | DESCR    | CLSMS     | ABALPH |
+----------+-----------+----------+--------+----------+-----------+--------+
| CLIENTE1 | VENDEDOR1 | CLIENTE1 | VENTA1 | SULFATO  | VENDEDOR1 | PEPE   |
| CLIENTE3 | NULL      | CLIENTE3 | VENTA3 | RESINA   | NULL      | NULL   |
| CLIENTE2 | VENDEDOR2 | CLIENTE2 | VENTA2 | CLORO    | VENDEDOR2 | JOSE   |
| CLIENTE4 | VENDEDOR1 | CLIENTE4 | VENTA4 | SOLUCION | VENDEDOR1 | PEPE   |
+----------+-----------+----------+--------+----------+-----------+--------+
4 rows in set (0.00 sec)


Obviamente que no es recomendable hacer un SELECT *, sino listar únicamente los campos que te interesen...

Por otro lado, ¿por qué nombras tus campos y tus tablas de esa manera? te recuerdo que los nombre de todos los objetos DEBEN SER REPRESENTATIVOS DE LO QUE ALMACENAN. Es parte de las buenas prácticas de SQL

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
Imágen de perfil de Isaias Islas Gonzalez
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

problema con query

Publicado por Isaias Islas Gonzalez (1921 intervenciones) el 12/04/2013 21:50:21
Excelente Leo

Supongo, solo eso, que sus tablas seran de algun aplicativo pre-diseñado, como un SAP o CRM
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

problema con query

Publicado por leonardo_josue (1173 intervenciones) el 12/04/2013 23:01:58
Hola de nuevo Carlos...

Como te comenté, el único cuidado que debes tener es en primer lugar no mezclar la forma en que haces la referencia a las tablas:

1
2
3
4
5
6
7
UTILIZANDO FROM-WHERE
...
FROM tabla1, tabla2, tabla3
WHERE
tabla1.campo = tabla2.campo
and tabla2.campo = tabla3.campo
...


1
2
3
4
5
UTILIZANDO JOIN'S
FROM tabla1 
INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
INNER JOIN  tabla3 ON tabla2.campo = tabla3.campo
....


Pero sobre todo, DEBES TENER CUIDADO DE PONER TODAS LAS CONDICIONES QUE RELACIONAN TUS DOS TABLAS, si falta alguna como te lo comenté, se realizará un producto cartesiano entre tus tablas. Checa el script:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
mysql> SELECT * FROM tabla1;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | one         |
|    2 | two         |
|    3 | three       |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla1, tabla2;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    1 | one         |
|    3 | tres        |    1 | one         |
|    1 | uno         |    2 | two         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    2 | two         |
|    1 | uno         |    3 | three       |
|    2 | dos         |    3 | three       |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
9 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla1 INNER JOIN tabla2;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    1 | one         |
|    3 | tres        |    1 | one         |
|    1 | uno         |    2 | two         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    2 | two         |
|    1 | uno         |    3 | three       |
|    2 | dos         |    3 | three       |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
9 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla1, tabla2 WHERE tabla1.id = tabla2.id;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla1 INNER JOIN tabla2 ON tabla1.id = tabla2.id;
+------+-------------+------+-------------+
| id   | descripcion | id   | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)


Eso es lo que pasaba en tu caso.

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