Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=e5abea90-f20b-4c9a-baed-18d3d4ccc1b8

Combinar consultas iguales en SQL: los operadores UNION y UNION ALL

BasesDeDatos-OptimizacionEn el lenguaje de consulta de datos SQL estándar, el operador UNION sirve para combinar los resultados de dos consultas independientes, devolviendo como resultado conjunto todos los registros obtenidos por ambas.

Evidentemente, para poder realizar la unión ambas consultas deben devolver exactamente los mismos campos, tanto sus nombres como el tipo de dato. Lo que no es necesario es que se obtengan de la misma manera. Es decir, unos podrían ser campos directos obtenidos de una consulta a una tabla, y los de la segunda parte podrían ser campos calculados. Mientras tengan el mismo nombre y tipo no hay problema.

Así en el caso más sencillo, por ejemplo, si tenemos dos tablas de información con datos de ventas separados por divisiones, algo como esto (en dos tablas diferentes):

image

image

Podemos escribir una consulta como esta:

SELECT Comercial, Venta FROM VentasSoftware
UNION
SELECT Comercial, Venta FROM VentasConsultoria

Para obtener el resultado combinado de ambas tablas:

image

Aquí hay un detalle importante. Si nos fijamos en estos resultados veremos que Pepe, que está en ambas tablas con el mismo valor de ventas, solo aparece una vez. Y es que UNION evita que haya registros duplicados en el resultado final. O sea, elimina las filas duplicadas en las que todos los valores de los campos son iguales.

Si queremos obtener la mezcla total, incluso con duplicados, debemos usar UNION ALL:

SELECT Comercial, Venta FROM VentasSoftware
UNION ALL
SELECT Comercial, Venta FROM VentasConsultoria

que en este caso nos devuelve:

image

En este caso vemos como el comercial "Pepe" está dos veces.

Además de esta evidente, existe otra diferencia muy importante entre ambos métodos: UNION ALL ofrece mucho más rendimiento que UNION. El motivo es que al no tener que discriminar los registros repetidos el proceso es mucho más simple. En consultas habituales de pocos registros no lo vamos a notar, pero en grandes consultas con muchos posibles resultados sí.

Además, si estamos seguros de que los dos conjuntos de resultados que vamos a unir no tienen datos comunes (o no nos importa), es mejor recurrir siempre a UNION ALL por este motivo.

Fecha de publicación:
José Manuel Alarcón Fundador de campusMVP, es ingeniero industrial y especialista en consultoría de empresa. Ha escrito diversos libros, habiendo publicado hasta la fecha cientos de artículos sobre informática e ingeniería en publicaciones especializadas. Microsoft lo ha reconocido como MVP (Most Valuable Professional) en desarrollo web desde el año 2004 hasta la actualidad. Puedes seguirlo en Twitter en @jm_alarcon o leer sus blog técnico o personal. Ver todos los posts de José Manuel Alarcón
Archivado en: Acceso a Datos

Boletín campusMVP.es

Solo cosas útiles. Una vez al mes.

🚀 Únete a miles de desarrolladores

DATE DE ALTA

x No me interesa | x Ya soy suscriptor

La mejor formación online para desarrolladores como tú

Comentarios (13) -

Una pregunta y si necesitamos que el campo por ejemplo PEPE aparezca una sola vez pero sumando los resultados?. Veras tengo que sumar los resultados de 2 consultas que son de 2 bases de datos diferentes. Ambas bases tienen la misma estructura y por separado la consulta funciona perfecto, pero no logro hacer que combine los resultados y los sume.

Responder

Puedes hacer un GROUP BY por ese campo por ejemplo, depende de la situación que se te presente.

Responder

Hola

Como puedo hacer para unir registros duplicados y que los campos repetidos esten separados.

Por ejemplo
Code| Nombre |Categoría|
123 | Danny Velasquez | Empleado |
123 | Danny Velasquez | Graduado|
123 | Danny Velasquez | Donante |
124 | Danny Cadenas | Empleado |
124 | Danny Cadenas| Graduado|
|

Lo que necesito es que se visualice así

Code| Nombre | Empleado | Graduado | Donante |
---------------------------------------------------------------
123 | Danny Velasquez | 1| 1| 1|
124 | Danny Cadenas | 1 | 1 | 0

o

Code| Nombre | Empleado | Graduado | Donante |
---------------------------------------------------------------
123 | Danny Velasquez | Empleado | Graduado | Donante
124 | Danny Cadenas | Empleado | Graduado | 0

Agradeceré mucho su apoyo.

Saludos,




Responder

Hola estimado.
Primero que  nada, muchas gracias por explicar los procedimientos de unión que los encuentro fascinante, pero como puedo que todos los valores que aparecen tengan el (.) del separador de miles y con los decimales que yo necesite?

Responder

Puedes darle formato con un to_number

Responder

Muy Bueno (y)

Responder

Hola muy util la respuesta, gracias

Responder

Luis Alberto
Luis Alberto

Hola disculpen como puedo hacer para que un registro se me refleje 3 veces ya que con  UNION ALL solo puedo reflejar 2 veces.

espero haber hecho bien la pregunta.
gracias ante manos

Responder

si lo que necesito es mostrar los campos de cuatro BD que son iguales y estan en el mismo servido

Responder

Andres Marcoleta
Andres Marcoleta

Hola amigo, tengo una duda en lo siguiente:
tengo un select que me arroja como resultado 9 registros con los campos A, B, C y D.
Por otra parte tengo un select que me arroja como resultado 3 registros con los campos A, X e Y.
Nótese que los campos A de ambas consultas, son iguales.
Como puedo unir ambos select en una misma consulta?

Responder

Hola espero puedan ayudarme tengo esta consulta
SELECT
  p.persId AS TECNICO,
    (Select COUNT(R.regEstado) where R.regEstado='A') as ASIGNADOS,
    (Select COUNT(R.regEstado) where R.regEstado='R') AS RESUELTOS,
    (Select COUNT(R.regEstado) where R.regEstado='F') AS FINALIZADOS      
FROM Registros AS R
INNER JOIN Persona AS p on R.persIdAsignado=p.persId
WHERE R.persIdAsignado='330704'
GROUP BY p.persId,R.regEstado

esto me devuelve lo siguiente
técnico / asignados / resueltos / finalizados
12              1                   null             null
12            null               3                   null
12           null                  null              6

==============================
hay alguna manera de obtener lo siguiente
técnico / asignados / resueltos / finalizados
12              1                     3                   6

Responder

Prueba asi:

SELECT
  p.persId AS TECNICO,
  count(case when  R.regEstado='A' then 1 else 0 end )  as ASIGNADOS,
  count(case when  R.regEstado='R' then 1 else 0 end ) AS RESUELTOS,
  count(case when  R.regEstado='F' then 1 else 0 end ) AS FINALIZADOS      
FROM Registros AS R
INNER JOIN Persona AS p on R.persIdAsignado=p.persId
WHERE R.persIdAsignado='330704'
GROUP BY p.persId

Responder

Como puedo hacer un drop, create y updates en la misma consulta y corra todo en orden. gracias

Responder

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.