Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Cómo unir tres tablas?

Estas en el tema de Cómo unir tres tablas? en el foro de Mysql en Foros del Web. Hola, espero que me podáis ayudar con una consulta. La situación es la siguiente: 1.TablaProductos: contiene precio unitario. 2.TablaProductosSeleccionados: contiene productos seleccionados. 3.TablaProductosComprados: contiene productos ...
  #1 (permalink)  
Antiguo 01/12/2012, 12:06
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 5 meses
Puntos: 0
Cómo unir tres tablas?

Hola, espero que me podáis ayudar con una consulta. La situación es la siguiente:
1.TablaProductos: contiene precio unitario.
2.TablaProductosSeleccionados: contiene productos seleccionados.
3.TablaProductosComprados: contiene productos comprados.

Un usuario va realizando una compra y va añadiendo al carrito productos. Eso se registra en 2.TablaProductosSeleccionados (usuario, cantidad, idProducto, etc).
Una vez seleccionados todos los productos, se realiza la compra como en el supermercado, pasando cada producto por caja. Cuando se compra un producto, esa línea se elimina de 2.TablaProductosSeleccionados y se crea en 3.TablaProductosComprados el registro definitivo. Las tablas 2 y 3 tienen el campo idProducto, y en la tabla 1 pueden obtener el precio del producto.

En mitad de una compra habrá productos en la tabla 2 ó en la 3, según esté la compra de avanzada. Es en este momento donde quiero obtener un reporte mediante consulta SQL con las cantidades y los precios de los productos del carrito, mezclando los que están seleccionados y los ya comprados.

Cómo puedo mostrar entonces los productos de las tablas 2 y 3 juntos, mostrando sus precios (que están en la tabla 1)?

Gracias por leer el tocho!

PD: La BD está creada ya, no la he creado yo.
  #2 (permalink)  
Antiguo 01/12/2012, 12:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Cómo unir tres tablas?

Soluciones a la carta, no damos, y menos servidas...
¿Ya probaste algo? ¿Hiciste algún intento?

Postea lo que probaste, y en lo posible la estructura (CREATE TABLE) de las tablas que mencionas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 01/12/2012, 17:12
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Cómo unir tres tablas?

No he dado más datos porque no tengo la BD delante, por eso intenté explicarlo lo mejor posible.

He probado de todo. Entre otras cosas:

select * from TablaProductos
join TablaSeleccionados on TablaSeleccionados.idProducto=TablaProductos.idPro ducto
join TablaComprados on TablaComprados.idProducto=TablaProductos.idProduct o

Pero claro, esto busca registros que estén en las TablasSeleccionados Y TablasComprados. Y yo lo que necesito es que estén en una tabla O la otra.
  #4 (permalink)  
Antiguo 01/12/2012, 17:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Cómo unir tres tablas?

Usa UNION.
Si la cosa es que están en una tabla o en otra, no es un JOIN a tres tablas, sino dos JOIN a dos tablas en un sólo conjunto.
La única condición es que cada JOIN debe devolver la misma cantidad de columnas, o de lo contrario generará un error.
Adicionalmente, te conviene hacer que cada SELECT genere una columna indicando el estado del producto, para saber en qué tabla está.
Código MySQL:
Ver original
  1. SELECT 'SELECCIONADO' `Estado`, S.*, P.*
  2. FROM TablaProductos P
  3.     INNER JOIN TablaSeleccionados S ON P.idProducto = S.idProducto
  4. SELECT 'COMPRADO' `Estado`, C.*, P.*
  5. FROM TablaProductos P
  6.     INNER JOIN TablaComprados C ON P.idProducto = C.idProducto
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/12/2012, 08:56
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Cómo unir tres tablas?

Pues no había contemplado la opción de UNION. Yo estaba empeñado en usar sólo JOIN.
Gracias por tu ayuda. Lo pruebo y os comento.
Un saludo.
  #6 (permalink)  
Antiguo 03/12/2012, 08:29
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Cómo unir tres tablas?

Bueno, he probado y no me vale.
Hay una cuarta tabla en discordia.

La siguiente consulta me va perfecta, pero me falta la columna Precio:

Código MySQL:
Ver original
  1. SELECT resumen.idProducto, tabla_seleccionados.qty_reserved,Tabla_Comprados.qty_purch FROM resumen,tabla_seleccionados, tabla_comprados
  2. WHERE resumen.idCompra=1
  3. and resumen.idProductoCompra =TablaSeleccionados.idProductoCompra (+)
  4. and resumen.idProductoCompra =TablaComprados.idProductoCompra (+)

Resultado
idProducto | Qty_Reserved | Qty_purch

Ahora quiero agregar la columna Unit_price que se obtiene de TablaProductos.
Agregando

Código SQL:
Ver original
  1. SELECT resumen.idProducto, tabla_seleccionados.qty_reserved,Tabla_Comprados.qty_purch,TablaProductos.unit_price FROM resumen,tabla_seleccionados, tabla_comprados, TablaProductos
  2. WHERE resumen.idCompra=1
  3. AND resumen.idProductoCompra =TablaSeleccionados.idProductoCompra (+)
  4. AND resumen.idProductoCompra =TablaComprados.idProductoCompra (+)
  5. AND TablaSeleccionados.stm_auto_key = TablaProductos.stm_auto_key (+)

va perfecto.

--------------------------
Pero al agregar el precio de los comprados me da un error.
ORA-01417: a table may be outer joined to at most one other table
Código SQL:
Ver original
  1. SELECT resumen.idProducto, tabla_seleccionados.qty_reserved,Tabla_Comprados.qty_purch,TablaProductos.unit_price FROM resumen,tabla_seleccionados, tabla_comprados, TablaProductos
  2. WHERE resumen.idCompra=1
  3. AND resumen.idProductoCompra =TablaSeleccionados.idProductoCompra (+)
  4. AND resumen.idProductoCompra =TablaComprados.idProductoCompra (+)
  5. AND TablaSeleccionados.stm_auto_key = TablaProductos.stm_auto_key (+)
  6. AND TablaComprados.stm_auto_key = TablaProductos.stm_auto_key (+)

--------------------------
He probado también con
Código SQL:
Ver original
  1. AND (TablaSeleccionados.stm_auto_key = TablaProductos.stm_auto_key (+)
  2.              OR
  3.              TablaComprados.stm_auto_key = TablaProductos.stm_auto_key (+))
y me da error
ORA-01719: outer join operator (+) not allowed in operand of OR or IN

Sabes cómo solucionarlo?

Última edición por gnzsoloyo; 03/12/2012 a las 09:15 Razón: Código SQL sin etiquetar
  #7 (permalink)  
Antiguo 03/12/2012, 08:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Cómo unir tres tablas?

Cita:
ORA-01417: a table may be outer joined to at most one other table
Cita:
ORA-01719: outer join operator (+) not allowed in operand of OR or IN
Estos son errores en Oracle, no MySQL... Y este es el Foro de MySQL.

¿Estás consciente de que Oracle y MySQL son DBMSs distintos, por más que hoy sean propiedad de la misma corporación?

Salvo aquello que se conoce como ANSI SQL, no comparten sintaxis.

Si estás usando Oracle, te paso el post al foro de Oracle, de lo contrario no lo pruebes en otro server que no sea MySQL.

Además, esto:
Cita:
Bueno, he probado y no me vale.
no es respuesta suficiente para que sepamos por qué no te "vale". Aunque en este caso yo infiero que es debido a que estás ejecutando sintaxis MySQL, inentendible para Oracle.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/12/2012 a las 08:46
  #8 (permalink)  
Antiguo 03/12/2012, 09:03
 
Fecha de Ingreso: diciembre-2012
Mensajes: 5
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Cómo unir tres tablas?

Tu solución con UNION resolvía un problema, pero no me vale porque no se muestran elementos que no están ni en TablaComprados ni en TablaSeleccionados.

Según he investigado, el problema está en que intento hacer OUTER JOIN dos veces a la misma tabla
and TablaSeleccionados.stm_auto_key = TablaProductos.stm_auto_key (+)
and TablaComprados.stm_auto_key = TablaProductos.stm_auto_key (+)


Esto no se permite ni para MySQL ni para Oracle. Por eso si me dices qué solución hay para MySQL me sirve también para Oracle.

Gracias.
  #9 (permalink)  
Antiguo 03/12/2012, 18:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Cómo unir tres tablas?

Esta sería una forma simple:
Código MySQL:
Ver original
  1.     idCompra,
  2.     idProducto,
  3.     unit_price Unitario,
  4.     SUM(qty_reserved) reservado,
  5.     SUM(totalReserva) totalReserva,
  6.     SUM(qty_purch) qty_purch,
  7.     SUM(totalCompra) totalCompra
  8.     (SELECT
  9.         R.idCompra,
  10.         R.idProducto,
  11.         P.unit_price Unitario,
  12.         S.qty_reserved,
  13.         (S.qty_reserved *  P.unit_price) totalReserva,
  14.         0  qty_purch,
  15.         0 totalCompra
  16.     FROM
  17.         Seleccionados S INNER JOIN Producto P ON S.stm_auto_key = P.stm_auto_key
  18.         INNER JOIN resumen R ON R.idProductoCompra =S.idProductoCompra
  19.         WHERE R.idCompra=1
  20.     UNION ALL
  21.     SELECT
  22.         R.idCompra,
  23.         R.idProducto,
  24.         P.unit_price Unitario,
  25.         0 qty_reserved,
  26.         0 totalReserva,
  27.         S.qty_purch,
  28.         (S.qty_purch *  P.unit_price) totalCompra
  29.     FROM Comprados C INNER JOIN Producto P ON S.stm_auto_key = P.stm_auto_key
  30.         INNER JOIN resumen R ON R.idProductoCompra =S.idProductoCompra
  31.     WHERE R.idCompra=1) T1
  32. GROUP BY idCompra, idProducto, unit_price Unitario;
funcionaría en MySQL, pero no estoy muy seguro de su portabilidad en Oracle, por lo que ya te dije, y tu pareces haber ignorado completamente:
Cita:
Salvo aquello que se conoce como ANSI SQL, no comparten sintaxis.
Eso significa que en muchos casos, ni la sintaxis ni la lógica aplicada puedes pasarla de uno a otro DBMS sin tener que hacer cambios que vuelven irreconocible la consulta.
No lo tomes a la ligera.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: join, multiples+tablas, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:44.