Ver Mensaje Individual
  #5 (permalink)  
Antiguo 24/02/2012, 13:13
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Datos inconsistente al colocar union

Hola m1di:

Hay que tener algunas consideraciones al momento de utilizar UNION:

Primero, si existen elementos que puedan aparecer en ambas partes de la unión y QUIERES QUE SE REPITAN debes utilizar UNION ALL, ya que de lo contrario la unión simple ELIMINA LOS REGISTROS DUPLICADOS.

Segundo, no es lo mismo realizar agrupaciones sobre las subconsultas QUE SOBRE EL RESULTADO DE LA UNIÓN.

supongamos que tienes dos tablas con la siguiente información:

Código:
TABLA1
id          descripcion cantidad
----------- ----------- -----------
1           uno         10
2           dos         20
3           tres        30
1           uno         40
2           dos         50

TABLA2
id          descripcion cantidad
----------- ----------- -----------
1           uno         10
4           cuatro      20
5           cinco       30
4           cuatro      40
5           cinco       50
Observa cómo se comporta la unión dependiendo de cómo manejas el parámetro ALL y la agrupación:

Código SQL:
Ver original
  1. SELECT id, descripcion, SUM(cantidad) FROM @tabla1 GROUP BY id, descripcion
  2. UNION ALL
  3. SELECT id, descripcion, SUM(cantidad)  FROM @tabla2 GROUP BY id, descripcion ORDER BY id
  4. /*
  5. id          descripcion
  6. ----------- ----------- -----------
  7. 1           uno         10
  8. 1           uno         50
  9. 2           dos         70
  10. 3           tres        30
  11. 4           cuatro      60
  12. 5           cinco       80
  13. */
  14.  
  15. SELECT id, descripcion, SUM(cantidad) FROM
  16. (
  17. SELECT id, descripcion, cantidad FROM @tabla1
  18. UNION
  19. SELECT id, descripcion, cantidad FROM @tabla2
  20. ) T
  21. GROUP BY id, descripcion ORDER BY id
  22.  
  23. /*
  24. id          descripcion
  25. ----------- ----------- -----------
  26. 1           uno         50
  27. 2           dos         70
  28. 3           tres        30
  29. 4           cuatro      60
  30. 5           cinco       80
  31. */
  32.  
  33. SELECT id, descripcion, SUM(cantidad) FROM
  34. (
  35. SELECT id, descripcion, cantidad FROM @tabla1
  36. UNION ALL
  37. SELECT id, descripcion, cantidad FROM @tabla2
  38. ) T
  39. GROUP BY id, descripcion ORDER BY id
  40. /*
  41. id          descripcion
  42. ----------- ----------- -----------
  43. 1           uno         60
  44. 2           dos         70
  45. 3           tres        30
  46. 4           cuatro      60
  47. 5           cinco       80
  48. */

En el primer caso NO AGRUPA LAS DESCRIPCIONES DE LA UNIÓN RESULTANTE, solo las de las subconsultas.

En el segundo caso, el registro

Código:
id          descripcion cantidad
----------- ----------- -----------
1           uno         10
aparece en ambas tablas, por lo tanto SÓLO SE CONTABILIZA UNA VEZ, es decir se eliminan los duplicados al no utilizar el parámetro ALL

En el tercer caso SI SE REALIZA LA AGRUPACIÓN SOBRE EL RESULTADO DE LA UNIÓN Y TAMBIÉN SE CONTABILIZAN LOS REGISTROS DUPLICADOS.

Saludos
Leo.