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

El left join me duplica los datos

Estas en el tema de El left join me duplica los datos en el foro de Mysql en Foros del Web. Hola que tal, tengo la siguiente query @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT s.id_stock , s.oc_id , s.id_bodega , p.nom_prov , c.modelo , b.nombre ...
  #1 (permalink)  
Antiguo 28/03/2018, 13:41
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 11 meses
Puntos: 0
Pregunta El left join me duplica los datos

Hola que tal,

tengo la siguiente query
Código MySQL:
Ver original
  1. SELECT s.id_stock, s.oc_id, s.id_bodega, p.nom_prov, c.modelo, b.nombre, oc.status, c.id_cat, SUM(s.cantidad) - COALESCE(SUM(sv.cant_ser), 0) cantidad
  2.         FROM stock s
  3.         LEFT JOIN
  4.             proveedores p
  5.             ON (s.id_prov = p.id_prov)
  6.         LEFT JOIN
  7.             cat c
  8.             ON (s.cat_id = c.id_cat)
  9.         LEFT JOIN
  10.             bodega b
  11.             ON (s.id_bodega = b.id_bodega)
  12.         LEFT JOIN oc
  13.             ON (s.oc_id = oc.oc_id)
  14.         LEFT JOIN
  15.             servicios sv
  16.             ON (s.id_stock = sv.id_stock)
  17.         WHERE oc.status = 'EN BODEGA'
  18.         GROUP BY s.codigo
  19.         ORDER BY id_stock ASC

Traigo información de varias tablas, pero lo principal del asunto son 2 tablas y mi problema es el siguiente.

Un SUM de s.cantidad, agrupada por s.codigo, le resto también un SUM de sv.cant_ser para obtener una cantidad

El problema es que si tengo mas de 1 fila en sv.cant_ser, el s.cantidad me devuelve una suma errónea.

No sé si es un error del LEFT JOIN o no me está agrupando correctamente uno de los campos. Aquí van de ejemplo las 2 tablas involucradas

Servicios sv. Acá la suma por codigo es correcta


Stock s. La suma del codigo que se repite en esta tabla debería ser 6, pero devuelve 10


Cualquier ayuda es de utilidad.
__________________
Aquí voy a escribir mi firma
  #2 (permalink)  
Antiguo 28/03/2018, 13:47
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: El left join me duplica los datos

te falta poner mas filtros en tu consulta, si nada mas lo haces por s.codigo, por lo que si hay mas de un codigo te lo va a aparecer, en esa consulta esta mostrando los 6 que dices, pero como tienes un codigo diferente mt3093 te presenta las cantidades de ese
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 28/03/2018, 15:12
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: El left join me duplica los datos

Cita:
Iniciado por Libras Ver Mensaje
te falta poner mas filtros en tu consulta, si nada mas lo haces por s.codigo, por lo que si hay mas de un codigo te lo va a aparecer, en esa consulta esta mostrando los 6 que dices, pero como tienes un codigo diferente mt3093 te presenta las cantidades de ese
Pero esa condición debe ir en el left join? hago un select dentro? no logro saber como filtrar mas la consulta

Como dato, agrupo codigo, para sumar. y la coincidencia entre ambas tables es id_stock

Gracias y Slds !!
__________________
Aquí voy a escribir mi firma
  #4 (permalink)  
Antiguo 28/03/2018, 17:12
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: El left join me duplica los datos

pon un pequeño ejemplo de tus tablas, el resultado que obtienes con la consulta, y lo que esperas obtener para poder ayudarte mejor, lo que pusiste son 2 tablas pero no puedo ver cual es el resultado final
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 28/03/2018, 20:01
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: El left join me duplica los datos

Cita:
Iniciado por Libras Ver Mensaje
pon un pequeño ejemplo de tus tablas, el resultado que obtienes con la consulta, y lo que esperas obtener para poder ayudarte mejor, lo que pusiste son 2 tablas pero no puedo ver cual es el resultado final
Tienes razón, se me olvidó pegar el resultado


En el primer post estan las 2 tablas, servicios y stock.

En servicios sumo y agrupo por codigo, y stock lo mismo, luego las resto en
Código MySQL:
Ver original
  1. SUM(s.cantidad) - COALESCE(SUM(sv.cant_ser), 0) cantidad
. creo que no logro agrupar en servicios, pero tampoco se donde poner esa condición

En SUM(s.cantidad) deberia obtener 6 (pero obtengo 10) y en COALESCE(SUM(sv.cant_ser), 0) obtengo 3 lo cual es correcto

Gracias !!
__________________
Aquí voy a escribir mi firma

Última edición por sebandrescc2; 28/03/2018 a las 20:12
  #6 (permalink)  
Antiguo 28/03/2018, 21:10
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: El left join me duplica los datos

Un ejemplo de todas las tablas implicadas, ahi no puedo ver donde se pierde o duplica la informacion
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 28/03/2018, 22:10
Avatar de sebandrescc2  
Fecha de Ingreso: diciembre-2012
Mensajes: 45
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: El left join me duplica los datos

Cita:
Iniciado por Libras Ver Mensaje
Un ejemplo de todas las tablas implicadas, ahi no puedo ver donde se pierde o duplica la informacion
Acá creo simplificar mi consulta
http://sqlfiddle.com/#!9/28bba/4

Si te fijas, no ocupo id para relacionar, sino el codigo para agrupar. Claramente las entradas no corresponden
__________________
Aquí voy a escribir mi firma
  #8 (permalink)  
Antiguo 29/03/2018, 06:28
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: El left join me duplica los datos

A mi entender, el primer problema que tienes es que estás creando en la primera query una relación en estrella, algo que es muy proclive a generar productos cartesianos, lo que parece ser el caso.
En realidad la solución mas adecuada pasaría porque vincules correctamente la secuencia de relaciones a partir de la primera tabla (STOCK), pero encadenando no la primera con todas, sino la primera con la segunda, la segunda con la tercera y así sucesivamente.

Ahora bien, en estos casos lo que debes entender es que si bien la tabla madre de la consulta puede necesitarse para mostrar TODOS los casos sin importar si existen relaciones o no con la segunda tabla, no es natural que de existir entre ambas, la segunda no tenga relaciones con la tercera y asi sucesivamente.

A lo que me refiero es que si tienes las tablas:

Cita:
stock
proveedores
cat
bodega
oc
servicios
No resulta creíble que puedas tener productos sin sus correspondientes proveedores, o stock que no esté asignado a determinadas bodegas. Tal vez tengas productos no categorizados, pero ¿productos sin proveedor?

A lo que voy es que no todos los JOIN puede que sean LEFT. Algunos es posible que correspondan ser INNER, y eso marca una gran diferencia.

De todos modos, si quieres un análisis mas preciso de tu query, necesitamos que nos aportes algunas cosas mas:
1) El CREATE TABLE de cada una, para entender las relaciones entre ellas, que no parecen muy razonables en esta query del primer post.
2) Un ejemplo o muestra de los datos reales de CADA UNA de las tablas, para visualizar como van a salir los datos y se relacionarán.
3) Un ejemplo de cómo debería salir la respuesta de la query, segun lo que necesitas.
__________________
¿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, left, tablas
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 11:39.