Los operadores UNION [ALL], INTERSECT y MINUS de Oracle
Podemos combinar multitud de consultas con los operadores UNION, UNION ALL, INTERSECT, y MINUS. Todo este conjunto de operadores tienen la misma precedencia, por lo que si una consulta contiene varios de estos operadores Oracle los evaluará de izquierda a derecha siempre que no haya paréntesis que expecifiquen otro orden.
Para entender estos operadores, os mostraré un ejemplo de cada uno de ellos con un sencillo ejemplo, en el que tendremos 2 tablas, cada una de ellas con los datos de los clientes que compraron un articulo en un año determinado.
Ejemplo operador UNION
La siguiente consulta combina el resultado de 2 consultas gracias al operador UNION, el cual eliminna las filas duplicadas después de realizar la unión. La siguiente consulta nos devolverá los clientes únicos que han comprado tanto en el año 2010 como en el año 2011:
SELECT nombre, apellidos, dni FROM tabla_clientes_2010 UNION SELECT nombre, apellidos, dni FROM tabla_clientes_2011 |
Ejemplo operador UNION ALL
El operador UNION devuelve solo las filas distintas que aparecen en ambas tablas, mientras que el operador UNION ALL devuelve todas las filas, ya que no elimina las filas duplicadas. La siguiente consulta nos devolverá los clientes que han comprado tanto en el año 2010 como en el año 2011 (si un cliente compró en ambos años, aparecerá 2 veces):
SELECT nombre, apellidos, dni FROM tabla_clientes_2010 UNION ALL SELECT nombre, apellidos, dni FROM tabla_clientes_2011 |
Ejemplo operador INTERSECT
El operador INTERSECT devuelve solo las filas que aparecen en ambas consultas, es decir los clientes que fueron clientes en el 2011 y en el 2010:
SELECT nombre, apellidos, dni FROM tabla_clientes_2010 INTERSECT SELECT nombre, apellidos, dni FROM tabla_clientes_2011 |
Ejemplo operador MINUS
la siguiente consulta combina el resultado de las 2 queries, y devuelve solo los elementos de la primera consulta que no se encuentren en la segunda, es decir todos aqueloos clientes que lo fueron en el 2010 pero no lo fueron en el 2011:
SELECT nombre, apellidos, dni FROM tabla_clientes_2010 MINUS SELECT nombre, apellidos, dni FROM tabla_clientes_2011 |