Capitulo 1–Leccion 2: Uniendo tablas relacionadas


Con bases de datos normalizadas (o sea, con claves primarias y foraneas en cada tabla), la información necesaria para un conjunto de resultados puede estar en dos o más tablas en la base de datos.

Utilizando el operador JOIN


El operador JOIN le permite seleccionar los datos de las columnas almacenadas en varias tablas relacionadas.
Aunque las relaciones reales, implementadas mediante la creación de PRIMARY KEY y FOREIGN KEY, no son necesarios,son necesarias al menos una columna en cada una de las tablas para que los resultados sean significativos.
Si una columna con el mismo nombre de columna existe en más de una tabla en la consulta, debe calificar la columna con el nombre de la tabla al definir la lista, seleccione las columnas de lista en la cláusula WHERE u otras cláusulas en la instrucción SELECT.
Por ejemplo, la columna Name existe en las tablas Production.Product, Production.Subcategory y Production.Category. Si se escribe una consulta que une a estas tablas y desea incluir la columna Name en la lista de selección o en otra parte en la consulta, necesitara escribirla como Production.Product .Name, y así sucesivamente.
Puede utilizar alias de tabla para evitar el código muy largo causado por el esquema y nombres de objetos. El siguiente ejemplo muestra el uso de alias:

SELECT FirstName, LastName, JobTitle, VacationHours, SickLeaveHours
FROM HumanResources.Employee E INNER JOIN Person.Person P
ON E.BusinessEntityID = P.BusinessEntityID;



Cuando se define una condición de unión, es necesario definir las tablas a unir, el tipo de combinación, y una condición de unión, que se compone de las columnas en que se combinan las tablas y el operador lógico. INNER JOIN es el tipo de combinación predeterminado sólo cuando la palabra clave  JOIN se especifica.

Definición de INNER JOINS

El ejemplo siguiente devuelve el nombre y apellido del empleado de la tabla Person.Contact y su puesto de trabajo, horas de enfermedad, y las horas de vacaciones a partir de la tabla HumanResources.Employee. Los alias no se utilizan en esta muestra. Tenga en cuenta que las columnas de la lista de selección no requieren calificación, ya que son únicos en ambas tablas. Debido a que el nombre de la columna BusinessEntityID se utiliza en ambas tablas, debe ser calificado con un nombre de la tabla cada vez que se le hace referencia:
SELECT FirstName, LastName, JobTitle, VacationHours, SickLeaveHours
FROM HumanResources.Employee INNER JOIN Person.Person
ON HumanResources.Employee.BusinessEntityID = Person.Person.BusinessEntityID;



image



Definición de OUTER JOINS

Outer join se puede utilizar para devolver todas las filas de una tabla y la información sólo de las filas que están en común de la otra tabla, o puede devolver todas las filas de todas las tablas en la cláusula JOIN. La palabra OUTER se puede omitir de la sintaxis, pero debe especificar  LEFT ,  RIGHT  , o FULL.

Los operadores de LEFT y RIGHT se puede utilizar para especificar de qué tabla todas las filas que se devuelven. Cuando se especifica LEFT OUTER JOIN, se devuelven todas las filas de la tabla a la izquierda de la palabra clave JOIN.

Esta tabla se conoce como la tabla externa (O Outer). Usted puede obtener el mismo resultado, ya sea con un operador de izquierda o derecha, cambiando el orden en que los nombres de tabla se hace referencia.

Por ejemplo, el código de ejemplo siguiente devuelve todas las filas de la tabla Person.Contact, junto con la información correspondiente de las filas coincidentes en la tabla HumanResources.Employee.
La imagen muestra el conjunto de resultados de esta consulta.
Observe los valores NULL en la JobTitle, VacationHours, y las columnas de la SickLeaveHours HumanResources. Estos valores no están disponibles para las filas de la Person.Contact tabla que no tiene la información correspondiente en la tabla HumanResources.Employee.

SELECT FirstName, LastName, JobTitle, VacationHours, SickLeaveHours
FROM HumanResources.Employee E RIGHT OUTER JOIN Person.Person P
ON E.BusinessEntityID = P.BusinessEntityID;



image

Debido a la tabla HumanResources.Employee no permite valores NULL para las columnas, es obvio que las filas se han añadido al conjunto de resultados al cambiar la INNER JOIN a RIGHT OUTER JOIN. Si los valores NULL se permitien, no sería capaz de utilizar la presencia de valores NULL sólo para determinar las filas que se han añadido al cambiar el tipo de combinación

El mismo conjunto de resultados se puede lograr mediante el uso de un LEFT OUTER JOIN reordenando los nombres de tabla, como en la siguiente consulta:
SELECT FirstName, LastName, JobTitle, VacationHours, SickLeaveHours
FROM Person.Person P LEFT OUTER JOIN HumanResources.Employee E
ON E.BusinessEntityID = P.BusinessEntityID;
image


Definición de FULL OUTER JOINS

FULL OUTER JOIN muestra todas las filas de cada tabla en la cláusula JOIN. Esto puede ser útil en la búsqueda de filas no coincidentes para probar que la integridad relacional no se está aplicando en las tablas.

Si hay restricciones FOREIGN KEY en la columna de combinación, FULL OUTER JOIN ofrece el mismo conjunto de resultados como un LEFT OUTER JOIN con la tabla donde se define la clave foránea en el lado izquierdo de la palabra clave JOIN.

Esto se debe a todos los valores en la columna FOREIGN KEY deben tener una fila correspondiente en la columna de clave principal para la restricción de ser satisfecho.

Además, cuando Las restricciones FOREIGN KEY están definidas, un OUTER JOIN define con la tabla de clave principal se define como la tabla externa proporciona los mismos resultados que un INNER JOIN.

Definición de CROSS JOINS

Cross Join proporcionar lo se conoce como un producto cartesiano de las dos tablas. Cada fila de la primera tabla se une con cada fila de la segunda tabla en la cláusula JOIN. Sólo hay algunas situaciones donde se utiliza este tipo de unión. El CROSS JOIN sintaxis es la misma que todos los tipos de unirse a otros.
Trabajar con más de dos tablas
Usted puede unirse a más de dos tablas para acceder a las columnas necesarias para la consulta. Una recomendación general es el desempeño para tratar de evitar operaciones JOIN, que incluyen más de cuatro o cinco tablas.
Usted siempre debe probar nuevas instrucciones JOIN, especialmente aquellos que contienen un gran número de tablas o filas, en un servidor que no sea el de produccion, para evitar los problemas causados por una larga ejecucion, lo que requiere muchos recursos.
El tipo más común de operación de combinación con más de dos tablas es INNER JOIN. En el siguiente ejemplo se expande en el INNER JOIN de principios de esta lección y añade una dirección de correo electrónico de la tabla Person.EmailAddress:

SELECT FirstName, LastName, JobTitle, VacationHours, SickLeaveHours, EmailAddress
FROM HumanResources.Employee INNER JOIN Person.Person
ON HumanResources.Employee.BusinessEntityID = Person.Person.BusinessEntityID
INNER JOIN Person.EmailAddress
ON Person.Person.BusinessEntityID = Person.EmailAddress.BusinessEntityID



image
Muy Importante:

¡Tienes que ser especialmente cuidadoso para verificar los conjuntos de resultados cuando se trabaja con el operador OUTER JOIN con más de dos tablas relacionadas. El motor de base de datos acumula resultado temporal conjuntos de la operación JOIN primero, y luego usa ese conjunto de resultados para la próxima operación de combinación. Según el orden definido y los operadores se especifica, puede obtener resultados diferentes.

Definición de SELF JOINS
SELF-JOIN es cuando a una sola tabla se hace referencia a varias veces en la cláusula JOIN, ya que utiliza un alias diferente cada vez que se refiere a la tabla.
Hay dos situaciones principales, cuando self-joins es beneficioso. La primera es cuando la base de datos incluye una tabla de referencia a sí misma.
En el siguiente ejemplo de la base de datos AdventureWorksDW2008 muestra el nombre de cada empleado con su nombre o su supervisor directo. Los alias ("E" de la referencia a la información de los empleados y "DS" para hacer referencia a la información supervisor directo) fueron utilizados para hacer la consulta más fácil de entender. El ParentEmployeeKey en los puntos de registro de cada empleado al campo de su supervisor directo EmployeeKey:
SELECT E.FirstName + ' ' + E.LastName AS 'Employee Name'
, DS.FirstName + ' ' + DS.LastName AS 'Direct Supervisor'
FROM DimEmployee E INNER JOIN DimEmployee DS
ON E.ParentEmployeeKey = DS.EmployeeKey;



image

Debido a que este cuadro se incluyen varios niveles de supervisores, también se puede utilizar una expresión de tabla común (CTE) para construir una salida recurrente.

Resumen de la lección


  • La cláusula JOIN le permite recuperar las columnas de las tablas relacionadas y agrupar los resultados en un solo conjunto de resultados.
  • Los tipos de combinación incluyen:  INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, y CROSS.
  • Mediante operadores JOIN se pueden combinar dos o más tablas.
  • Una tabla puede unirse a sí mismo mediante la definición de alias diferentes para cada referencia a la tabla.

No hay comentarios:

Publicar un comentario