Professional Documents
Culture Documents
Un JOIN se hace básicamente entre un FOREIGN KEY y un PRIMARY KEY. El FOREIGN KEY representa
cualquier campo o unión de campos en la tabla A que necesitan ser validados contra campos similares en la
tabla B en donde dichos campos son PRIMARY KEY.
Sintaxis:
PRIMERA TABLA
Tipo de JOIN
SEGUNDA TABLA
ON ( Condicion del JOIN )
Figure 1. La tabla de facturas está relacionada a la tabla de clientes por el campo IdCliente, el cual es un FK en la tabla de
facturas y un PK en la tabla de clientes.
• INNER. Incluye todas las filas de la tabla A donde el operador de comparación (= o <> ) se cumpla en
tabla B. Por ejemplo: sacar todos los empleados y el nombre del departamento al que pertenece, esto
implica que para cada departamento en empleado debe haber registro en la tabla de departamento o
esa fila no sale en la consulta.
• OUTER. Incluye todas las filas de la tabla A aunque no exista un equivalente en la tabla B. Por ejemplo,
si tenemos algunos empleados cuyo departamento no se encuentra definido en la tabla de
departamentos, con el OUTER JOIN aun así el empleado sería mostrado.
El OUTER JOIN puede ser LEFT, RIGHT o FULL de tal modo que se le pueda indicar cuál es la tabla
principal de la cual se van a sacar todos los registros aunque no existan equivalentes en la tabla
secundaria.
• CROSS. Representa el producto cartesiano, todos los registros de la tabla A son combinados con todos
los registros de la tabla B.
INNER JOIN. Saca todos los registros de la tabla A para los que exista una contraparte en la tabla B.
Cada empleado pertenece a un departamento, esa relación se hace posible a través del campo id de departamento.
Departamento:
IdDep Nombre
----------- --------------------------------------------------
1 Operaciones
2 Cobro
5 Legal
Empleado:
IdEmp nombre IdDep
----------- -------------------------------------------------- -----------
1 Carlos 1
2 Pedro 1
3 Maria 2
4 Juan 3
Si queremos mostrar un listado de empleados deberíamos presentar no solo el código del departamento al que
pertenece sino también el nombre dicho departamento.
Resultado:
IdEmp nombre Nombre Departamento
----------- -------------------------------------------------- --------------------------------------------------
1 Carlos Operaciones
2 Pedro Operaciones
3 Maria Cobro
SELECT codigo, nombre AS Nombre_Empleado FROM empleado WHERE sueldo > 100
La columna nombre en el resultado saldrá con el título Nombre_Empleado. Si en el ALIAS se necesita introducir espacios
entonces se debe utilizar el corchete: [Nombre Empleado].
OUTER JOIN. Muestra todo lo de la tabla A aunque no exista una contra parte en la tabla B. En el OUTER
podemos aplicar las variantes LEFT y RIGHT para indicar cuál es la principal en la relación, también existe la
variante FULL para indicar que puede haber faltas en ambos sentidos.
Con el ejemplo anterior se pudo observar que aplicando el INNER JOIN el empleado 4 no sale, esto se debe a que no
existe un departamento con el código 3. Aplicando el LEFT JOIN logramos que el empleado 4 salga aunque no existe su
contra parte en departamentos.
Resultado:
IdEmp nombre Nombre Departamento
----------- -------------------------------------------------- --------------------------------------------------
1 Carlos Operaciones
2 Pedro Operaciones
3 Maria Cobro
4 Juan NULL
Resultado:
IdEmp nombre Nombre Departamento
----------- -------------------------------------------------- --------------------------------------------------
1 Carlos Operaciones
2 Pedro Operaciones
3 Maria Cobro
NULL NULL Legal
Y si finalmente cambiamos a FULL OUTER tendremos al empleado juan sin departamento y al departamento Legal sin
empleado.
Select emp.IdEmp, emp.nombre ,dep.Nombre as [Nombre Departamento]
from Empleado emp
full outer join Departamento dep on emp.IdDep = dep.IdDep
Resultado:
IdEmp nombre Nombre Departamento
----------- -------------------------------------------------- ---------------------------------
1 Carlos Operaciones
2 Pedro Operaciones
3 Maria Cobro
NULL NULL Legal
4 Juan NULL
Esta actualización afecta todas las facturas donde el cliente se encuentre en estado = 1. La condición del
estado se encuentra dentro de otra tabla, por eso es necesario establecer una relación.
Una de las características principales de las CTE es la posibilidad de permitir consultas recursivas. Es decir,
consultas donde es necesario referirse a la misma tabla n veces.
Para ilustrar el caso vamos a tomar el ejemplo del señor Robert Sheldon, el cual se encuentra en unos de los
enlaces de referencias, en ese ejemplo se tiene una tabla de empleados donde se dice que cada empleado
tiene un Manager, y este Manager a su vez es un empleado. Esto quiere decir que para mostrar el empleado
con sus datos y los datos manager se necesita ir a la misma tabla de empleado por cada registro, esto es
recursivo.
GO
GO
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT FirstName + ' ' + LastName FROM Employees
WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID