alvaro.gonzalezsotillo@educa.madrid.org

Producto cartesiano y JOIN

Álvaro González Sotillo

Created: 2019-12-06 vie 18:04

1 Producto cartesiano

  • Es una operación de conjuntos
  • Para calcular \(P = A \times B\)
    • Por cada elemento \(a \in A\)
      • Por cada elemento \(b \in B\)
        • \((a b)\) es un elemento de \(P\)
  • Ejemplo
    • \(A =\) {Juan, María}
    • \(B =\) {González, Pérez, García}
    • \(P =\) {Juan González, Juan Pérez, Juan García, María González, María Pérez, María García}
  • Se llama producto porque \(|P| = |A| \cdot |B|\)

2 Tabla orginal

  • Solo un pedido al día
  • No respeta 3FN (Precio depende de parte de la clave)
Tabla 1 VENTAS
Producto Precio Cantidad Fecha pedido Cliente
Pera 1 2 1-1 Pepe
Manzana 2 4 1-1 Pepe
Naranja 3 3 1-1 María
Manzana 2 6 1-2 María
Pera 1 5 1-2 Juan
Naranja 3 3 1-2 Juan

3 Tablas normalizadas

Tabla 2 PRODUCTOS
Producto Precio
Pera 1
Manzana 2
Naranja 3
Tabla 3 PEDIDOS
Producto Cantidad Fecha pedido Cliente
Pera 2 1-1 Pepe
Manzana 4 1-1 Pepe
Naranja 3 1-1 María
Manzana 6 1-2 María
Pera 5 1-2 Juan
Naranja 3 1-2 Juan

4 Cómo recuperar información original

  • La tabla original VENTAS puede seguir siendo necesaria para un informe
  • Se puede recuperar con los siguientes pasos:
    • Se calcula la tabla PRODUCTOS \(\times\) PEDIDOS
    • Quitamos las filas que no respeten la foreign key

4.1 PRODUCTOS \(\times\) PEDIDOS

PRODUCTO.producto PRODUCTO.precio PEDIDOS.producto PEDIDOS.cantidad PEDIDOS.Fecha pedido PEDIDOS.cliente
Pera 1 Pera 2 1-1 Pepe
Pera 1 Manzana 4 1-1 Pepe
Pera 1 Naranja 3 1-1 María
Pera 1 Manzana 6 1-2 María
Pera 1 Pera 5 1-2 Juan
Pera 1 Naranja 3 1-2 Juan
Manzana 2 Pera 2 1-1 Pepe
Manzana 2 Manzana 4 1-1 Pepe
Manzana 2 Naranja 3 1-1 María
Manzana 2 Manzana 6 1-2 María
Manzana 2 Pera 5 1-2 Juan
Manzana 2 Naranja 3 1-2 Juan
Naranja 3 Pera 2 1-1 Pepe
Naranja 3 Manzana 4 1-1 Pepe
Naranja 3 Naranja 3 1-1 María
Naranja 3 Manzana 6 1-2 María
Naranja 3 Pera 5 1-2 Juan
Naranja 3 Naranja 3 1-2 Juan

4.2 PRODUCTOS \(\times\) PEDIDOS, filtrado

  • Nos quedamos solo con las filas where PRODUCTO.producto = PEDIDOS.producto
PRODUCTO.producto PRODUCTO.precio PEDIDOS.producto PEDIDOS.cantidad PEDIDOS.Fecha pedido PEDIDOS.cliente
Pera 1 Pera 2 1-1 Pepe
Pera 1 Pera 5 1-2 Juan
Manzana 2 Manzana 4 1-1 Pepe
Manzana 2 Manzana 6 1-2 María
Naranja 3 Naranja 3 1-1 María
Naranja 3 Naranja 3 1-2 Juan

5 Sintaxis SQL

select 
  *
from 
  PRODUCTOS,PEDIDOS
where
  PRODUCTOS.producto = PEDIDOS.producto;
select 
  *
from 
  PRODUCTOS join PEDIDOS on PRODUCTOS.producto = PEDIDOS.producto;