Capitulo 1–Leccion 4: Combinando conjuntos de datos


SQL Server 2008 proporciona varios operadores que le proporcionan la capacidad de combinar o comparar los resultados de varias instrucciones SELECT.
El operador UNION ha estado disponible desde la primera versión de SQL Server para proporcionar la capacidad de combinar los conjuntos de resultados de varias consultas.
Por otro lado, los operadores EXCEPT e INTERSECT se introdujeron en SQL Server 2005 para proporcionar la capacidad de comparar los resultados de dos consultas y proporcionar un nuevo resultado conjunto en función de si hay o no hay filas en común entre los conjuntos de resultados.
Además, los conjuntos de datos pueden ser manipulados usando el operador APPLY para aplicar una tabla de función con valores de cada fila en contra de los resultados de la consulta de lo que se define como la tabla externa.
La UNION, EXCEPT e INTERSECT se pueden especificar entre dos o más consultas para proporcionar un conjunto de resultados. Mientras que el operador UNION combina los conjuntos de resultados de las consultas múltiples en un solo conjunto de resultados, EXCEPT e INTERSECT comparar los conjuntos de resultados de dos consultas para determinar qué subconjunto de filas debe ser incluido en el conjunto de resultados de final.
 

Utilizando el operador UNION

El operador UNION permite combinar los conjuntos de resultados creados por varias instrucciones SELECT en un único conjunto de resultados. Aunque la sintaxis para el operador UNION es sencillo (se agrega la palabra UNION o UNION ALL entre cada instrucción SELECT), debe seguir algunas reglas básicas, si desea que la consulta tenga éxito.
Cuando se especifica el operador UNION, tanto en las consultas deben devolver el mismo número de columnas. Además, cada tipo de datos en las columnas correspondientes deben ser compatibles.
Por ejemplo, si la primera columna en una instrucción SELECT tiene un tipo de datos entero y la primera columna de la segunda instrucción SELECT tiene un tipo de datos de tipo carácter, el campo entero debe convertirse para que el comando tenga éxito.
En la base de datos Northwind, los clientes tienen un campo alfanumérico de identificación de cliente y los empleados tienen un campo identificador numérico. Si desea recuperar estas columnas como un solo conjunto de resultados, el campo de empleado tendría que convertirse, como en este ejemplo de consulta:
SELECT CONVERT(Char(8),Employees.EmployeeID) FROM Employees
UNION
SELECT Customers.CustomerID FROM Customers



Además de las reglas enumeradas anteriormente, hay otras reglas que usted debe tener en cuenta. En primer lugar, los títulos de las columnas se toman de la primera consulta en la lista. Por lo tanto, usted debe definir alias en la primera instrucción SELECT. Además, las cláusulas ORDER BY debe ser definida en el final de la última instrucción SELECT. La cláusula ORDER BY puede hacer referencia a los alias definidos en la primera instrucción SELECT. Por último, si las filas se deben filtrar, cada instrucción SELECT debe incluir su propia cláusula WHERE.
La palabra clave ALL especifica que todas las filas, incluyendo filas duplicadas, deben ser devueltas. Por defecto, las filas duplicadas no se devuelven.
El siguiente ejemplo también utiliza las tablas Empleados y clientes de la base de datos Northwind para crear un único conjunto de resultados que combina los clientes y empleados en un solo conjunto de resultados que contenga el nombre, razón social y número de teléfono:

SELECT FirstName + ' ' + LastName AS 'Contact Name'
, 'Northwind Traders' AS 'Company'
, Employees.HomePhone AS 'Phone'
FROM Employees
UNION
SELECT ContactName, CompanyName, Phone
FROM Customers
ORDER BY 'Contact Name';



image
 

Utilizando los comandos EXCEPT e INTERSECT


A diferencia del operador UNION, que devuelve una combinación de las filas de varias sentencias SELECT, EXCEPT e INTERSECT comparan los conjuntos de resultados de dos consultas separadas y proporcionan un subconjunto de la información.
El operador EXCEPT devuelve todas las filas que existen en la tabla a la izquierda del operador y que no tienen registros coincidentes en la tabla a la derecha. En el siguiente ejemplo de la base de datos AdventureWorksDW2008, los empleados que nunca han puesto una orden de ventas por distribuidor se enumeran en el conjunto de resultados:

SELECT EmployeeKey
FROM DimEmployee
EXCEPT
SELECT EmployeeKey
FROM FactResellerSales



Al igual que la instrucción UNION, el mismo número de columnas con tipos de datos compatibles se deben definir en ambas consultas. Al lograr esto, usted puede unir a las tablas y utilizar el operador EXCEPT. El ejemplo siguiente agrega el nombre del empleado y el cargo la consulta que figuran en la muestra anterior:

SELECT EmployeeKey, FirstName, LastName, Title
FROM DimEmployee
EXCEPT
SELECT FRS.EmployeeKey, DE.FirstName, DE.LastName, DE.Title
FROM FactResellerSales FRS
JOIN DimEmployee DE
ON DE.EmployeeKey = FRS.EmployeeKey
ORDER BY Title;


Por otro lado, si queremos ver sólo los empleados que han puesto
órdenes de ventas por distribuidor, podemos usar el comando INTERSECT,
como se muestra en este ejemplo:



SELECT EmployeeKey, FirstName, LastName, Title
FROM DimEmployee
INTERSECT
SELECT FRS.EmployeeKey, DE.FirstName, DE.LastName, DE.Title
FROM FactResellerSales FRS
JOIN DimEmployee DE
ON DE.EmployeeKey = FRS.EmployeeKey
ORDER BY Title;


 

Utilizando el operador APPLY


El operador APPLY es diferente de los otros operadores analizados hasta ahora, ya que utiliza los resultados de una consulta a una tabla o vista como lo que se llama la entrada izquierda, y los resultados de una tabla de valores de funcionar como lo que se conoce como la entrada de la derecha.

El operador APPLY tiene dos formas, CROSS APPLY y OUTER APPLY. CROSS APPLY sólo devuelve las filas de la salida de la izquierda, que produce los datos de los valores de tabla de la función.
El OUTER APPLY devuelve todas las filas de la tabla de la izquierda, exterior. Como una instrucción de combinación externa, los valores NULL se incluyen las columnas que, donde la función no produce los datos.
En el siguiente ejemplo la consulta devuelve el nombre, apellido, cargo laboral, datos de contacto y dirección de correo electrónico para todos los contactos en la base de datos mediante la combinación de los resultados de la tabla Person.EmailAddress contra la tabla ufnGetContactInformation. El valor BusinessEntityID de cada fila del conjunto de resultados de mesa es la entrada requerida por la función ufnGetContactInformation:
(Nota: Tener en cuenta que esta consulta puede tardar mucho tiempo en ejecutarse.)

SELECT GCI.FirstName, GCI.LastName
, GCI.JobTitle, GCI.BusinessEntityType
, PE.EmailAddress
FROM Person.EmailAddress AS PE
CROSS APPLY
dbo.ufnGetContactInformation(PE.BusinessEntityID) AS GCI;

image

En el ejemplo anterior, la consulta devuelve 19.683 filas. Cuando CROSS APPLY se sustituye por OUTER APPLY, todos los 19.972 registros en la tabla EmailAddress son devueltos, a pesar de que algunos de ellos no disponen de datos que devuelve la función. La siguiente imagen muestra el resultado conjunto de los OUTER APPLY mostrando NULL en todas las columnas que devuelve la función.

image


Resumen de la lección
 

  • El operador UNION combina los conjuntos de resultados a partir de dos o más sentencias SELECT.

  • El operador EXCEPT devuelve las filas que están en la sentencia SELECT a la izquierda y no tienen registros coincidentes en la sentencia SELECT derecha.

  • El operador INTERSECT devuelve sólo las filas que son compartidos por las dos sentencias SELECT.

  • El operador APPLY utiliza los resultados de una consulta como entrada para aplicar una con valores de tabla para cada fila del conjunto de resultados.

  • OUTER APPLY devuelve todas las filas de la tabla externa, junto con los resultados devueltos por la función cuando las filas partido, mientras que CROSS APPLY sólo devuelve las filas de la tabla externa, donde existe una coincidencia en los resultados de la función.

No hay comentarios:

Publicar un comentario