UNION, INTERSECT y EXCEPT
Temas
Los operadores de conjunto UNION, INTERSECT y EXCEPT se utilizan para comparar y fusionar los resultados de dos expresiones de consulta diferentes. Por ejemplo, si desea saber qué usuarios de un sitio web son compradores y vendedores pero los nombres de usuario están almacenados en diferentes columnas o tablas, puede buscar la intersección de estos dos tipos de usuarios. Si desea saber qué usuarios de un sitio web son compradores pero no vendedores, puede usar el operador EXCEPT para buscar la diferencia entre las dos listas de usuarios. Si desea crear una lista de todos los usuarios, independientemente de la función, puede usar el operador UNION.
Sintaxis
query { UNION [ ALL ] | INTERSECT | EXCEPT | MINUS } query
Parámetros
- consulta
-
Una expresión de consulta que corresponde, en la forma de su lista de selección, a una segunda expresión de consulta que sigue el operador UNION, INTERSECT o EXCEPT. Las dos expresiones deben contener la misma cantidad de columnas de salida con tipos de datos compatibles; de lo contrario, no se podrán comparar ni fusionar los dos conjuntos de resultados. Las operaciones de conjunto no permiten conversiones implícitas entre diferentes categorías de tipos de datos. Para obtener más información, consulte Conversión y compatibilidad de tipos.
Puede crear consultas que contengan una cantidad ilimitada de expresiones de consulta y vincularlas con operadores UNION, INTERSECT y EXCEPT en cualquier combinación. Por ejemplo, la siguiente estructura de consulta es válida, suponiendo que las tablas T1, T2 y T3 contienen conjuntos de columnas compatibles:
select * from t1 union select * from t2 except select * from t3 order by c1;
- UNION
-
Operación de conjunto que devuelve filas de dos expresiones de consulta, independientemente de si las filas provienen de una o ambas expresiones.
- INTERSECT
-
Operación de conjunto que devuelve filas que provienen de dos expresiones de consulta. Las filas que no se devuelven en las dos expresiones se descartan.
- EXCEPT | MINUS
-
Operación de conjunto que devuelve filas que provienen de una de las dos expresiones de consulta. Para calificar para el resultado, las filas deben existir en la primera tabla de resultados, pero no en la segunda. MINUS y EXCEPT son sinónimos exactos.
- ALL
-
La palabra clave ALL conserva cualquier fila duplicada que UNION produce. El comportamiento predeterminado cuando no se usa la palabra clave ALL es descartar todos estos duplicados. No se admiten las expresiones INTERSECT ALL, EXCEPT ALL y MINUS ALL.
Orden de evaluación para los operadores de conjunto
Los operadores de conjunto UNION y EXCEPT se asocian por la izquierda. Si no se especifican paréntesis para establecer el orden de prioridad, los operadores se evalúan de izquierda a derecha. Por ejemplo, en la siguiente consulta, UNION de T1 y T2 se evalúa primero, luego se realiza la operación EXCEPT en el resultado de UNION:
select * from t1 union select * from t2 except select * from t3 order by c1;
El operador INTERSECT prevalece sobre los operadores UNION y EXCEPT cuando se utiliza una combinación de operadores en la misma consulta. Por ejemplo, la siguiente consulta evalúa la intersección de T2 y T3, y luego unirá el resultado con T1:
select * from t1 union select * from t2 intersect select * from t3 order by c1;
Al agregar paréntesis, puede aplicar un orden diferente de evaluación. En el siguiente caso, el resultado de la unión de T1 y T2 está intersectado con T3, y la consulta probablemente produzca un resultado diferente.
(select * from t1 union select * from t2) intersect (select * from t3) order by c1;
Notas de uso
-
Los nombres de la columnas que se devuelven en el resultado de una consulta de operación de conjunto son los nombres (o alias) de la columnas de las tablas de la primera expresión de consulta. Debido a que estos nombres de columnas pueden ser confusos, porque los valores de la columna provienen de tablas de cualquier lado del operador de conjunto, se recomienda proporcionar alias significativos para el conjunto de resultados.
-
Una expresión de consulta que precede a un operador de conjunto no debería contener una cláusula ORDER BY. Una cláusula ORDER BY produce resultados significativos ordenados solo cuando se utiliza al final de una consulta que contiene operadores de conjunto. En este caso, la cláusula ORDER BY se aplica a los resultados finales de todas las operaciones de conjunto. La consulta extrema también puede contener cláusula LIMIT y OFFSET estándar.
-
Cuando las consultas del operador de conjunto devuelven resultados decimales, las columnas de resultado correspondientes se promueven a devolver la misma precisión y escala. Por ejemplo, en la siguiente consulta, donde T1.REVENUE es una columna DECIMAL(10,2) y T2.REVENUE es una columna DECIMAL(8,4), el resultado decimal se promueve a DECIMAL(12,4):
select t1.revenue union select t2.revenue;
La escala es
4
ya que es la escala máxima de las dos columnas. La precisión es12
ya que T1.REVENUE requiere 8 dígitos a la izquierda del punto decimal (12 - 4 = 8). Este tipo de promoción garantiza que todos los valores de ambos lados de UNION encajen en el resultado. Para valores de 64 bits, la precisión de resultados máxima es 19 y la escala de resultados máxima es 18. Para valores de 128 bits, la precisión de resultados máxima es 38 y la escala de resultados máxima es 37.Si el tipo de datos resultante supera los límites de precisión y escala de Amazon Redshift, la consulta devuelve un error.
-
En el caso de las operaciones de conjunto, las dos filas se tratan como idénticas si, para cada par de columnas correspondiente, los dos valores de datos son iguales o NULL. Por ejemplo, si las tablas T1 y T2 contienen una columna y una fila, y esa fila es NULL en ambas tablas, una operación INTERSECT sobre esas tablas devuelve esa fila.