MySQL - Datos de diferentes tablas para almacenamiento

   
Vista:

Datos de diferentes tablas para almacenamiento

Publicado por Daniel (1 intervención) el 01/07/2015 09:52:51
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Editado: Ya lo tengo solucionado, cuando lei el post que he puesto se me ocurrió algo y ha funcionado:

Select items.Description, sales.Price, sales.Quantity from items JOIN sales
where items.Item = sales.Item;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Hola pues actualmente estoy realizando una aplicación web con asp.net y tengo una base de datos con MySql y utilizo entidades aunque hasta ahi no hay ningún problema. El problema viene en que debo generar un informe pdf y el programa visual studio me permite enlazar datos de la base de datos para utilizarlos en un generador de informes ahora la cuestión es la siguiente;

Debo mostrar por ejemplo el Numero de Ticket (campo Number en tabla sales) el Precio(price) y cantidad (Quantity) de la misma tabla. En dicha tabla tengo un campo que llamado Item y es el codigo de barras de los productos, pero no debe aparecer el codigo de barras si no el Nombre (Descripcion) que contiene la tabla items.

En resumen quiero utilizar el codigo de barra (llamado item) que se repite en ambas tablas para sacar el campo description de la tabla Items/Productos y además deben aparecer los campos Cantidad y Precio de la tabla Ventas/Sales

Hasta ahora conseguido con esta consulta sacar solo la description
SELECT Description
FROM items a
INNER JOIN sales b
WHERE a.Item = b.Item;

Saludos.
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

Datos de diferentes tablas para almacenamiento

Publicado por leonardo_josue (81 intervenciones) el 01/07/2015 15:49:22
Hola Daniel:

Sólo una observación: Si checas bien la sintaxis del JOIN, te darás cuenta que estás omitiendo la cláusula ON... en lugar de poner la condición de igualación en el WHERE, es decir, tu consulta debería quedar así:

1
2
3
SELECT items.Description, sales.Price, sales.Quantity
FROM items
JOIN sales ON items.Item = sales.Item;

El resultado es el mismo, sin embargo el performance de la consulta es mejor. De la manera en que lo estás haciendo (sin el ON), en primer lugar se realiza un producto CARTESIANO entre las tablas. Observa este ejemplo: supongamos que tienes estas dos tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tabla1;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+-------------+
| id_2 | descripcion |
+------+-------------+
|    1 | one         |
|    2 | two         |
|    3 | three       |
+------+-------------+
3 rows in set (0.00 sec)

Observa lo que pasa con el JOIN cuando no colocas la cláusula ON:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT * FROM tabla1
    -> INNER JOIN tabla2;
+------+-------------+------+-------------+
| id_1 | descripcion | id_2 | 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)

El orden de ejecución de este tipo de sentencias es PRIMERO el JOIN y después el WHERE, por lo tanto, tal como lo estás poniendo, primero se ejecuta el producto cartesiano y después se filtra ese producto;

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla1
    -> INNER JOIN tabla2
    -> WHERE tabla1.id_1 = tabla2.id_2;
+------+-------------+------+-------------+
| id_1 | descripcion | id_2 | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)

Cuando incluyes el ON en la consulta, este forma parte del JOIN, por lo tanto se ejecuta ANTES DEL WHERE, evitando el producto cartesiano y arrojando el mismo resultado.

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT * FROM tabla1
    -> INNER JOIN tabla2
    -> ON tabla1.id_1 = tabla2.id_2;
+------+-------------+------+-------------+
| id_1 | descripcion | id_2 | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
|    3 | tres        |    3 | three       |
+------+-------------+------+-------------+
3 rows in set (0.00 sec)

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