|
Tutorial de SQL SERVER
9. Consultas de Unión Internas
Las vinculaciones entre tablas se realiza mediante
la cláusula INNER que combina registros de dos tablas siempre que
haya concordancia de valores en un campo común. Su sintaxis es:
SELECT campos FROM tb1 INNER
JOIN tb2 ON tb1.campo1 comp tb2.campo2
En donde:
tb1, tb2
Son los nombres de las tablas desde las que se
combinan los registros.
campo1, campo2
Son los nombres de los campos que se combinan.
Si no son numéricos, los campos deben ser del mismo tipo de datos
y contener el mismo tipo de datos, pero no tienen que tener el mismo nombre.
comp
Es cualquier operador de comparación relacional
: =, <, >, <=, >=, o <>.
Se puede utilizar una operación INNER JOIN
en cualquier cláusula FROM. Esto crea una combinación por
equivalencia, conocida también como unión interna. Las combinaciones
Equi son las más comunes; éstas combinan los registros de
dos tablas siempre que haya concordancia de valores en un campo común
a ambas tablas. Se puede utilizar INNER JOIN con las tablas Departamentos
y Empleados para seleccionar todos los empleados de cada departamento.
Por el contrario, para seleccionar todos los departamentos (incluso si
alguno de ellos no tiene ningún empleado asignado) se emplea LEFT
JOIN o todos los empleados (incluso si alguno no está asignado a
ningún departamento), en este caso RIGHT JOIN.
Si se intenta combinar campos que contengan datos
Memo u Objeto OLE, se produce un error. Se pueden combinar dos campos numéricos
cualesquiera, incluso si son de diferente tipo de datos. Por ejemplo, puede
combinar un campo Numérico para el que la propiedad Size de su objeto
Field está establecida como Entero, y un campo Contador.
El ejemplo siguiente muestra cómo podría
combinar las tablas Categorías y Productos basándose en el
campo IDCategoria:
SELECT
Nombre_Categoría, NombreProducto
FROM
Categorias INNER JOIN
Productos
ON
Categorias.IDCategoria = Productos.IDCategoria;
En el ejemplo anterior, IDCategoria es el campo
combinado, pero no está incluido en la salida de la consulta ya
que no está incluido en la instrucción SELECT. Para incluir
el campo combinado, incluir el nombre del campo en la instrucción
SELECT, en este caso, Categorias.IDCategoria.
También se pueden enlazar varias cláusulas
ON en una instrucción JOIN, utilizando la sintaxis siguiente:
SELECT campos
FROM tabla1 INNER JOIN tabla2
ON tb1.campo1 comp tb2.campo1
AND
ON tb1.campo2 comp tb2.campo2)
OR
ON tb1.campo3 comp tb2.campo3)];
También puede anidar instrucciones JOIN
utilizando la siguiente sintaxis:
SELECT campos
FROM tb1 INNER JOIN
(tb2 INNER JOIN [( ]tb3
[INNER JOIN [( ]tablax [INNER
JOIN ...)]
ON tb3.campo3 comp tbx.campox)]
ON tb2.campo2 comp tb3.campo3)
ON tb1.campo1 comp tb2.campo2;
Un LEFT JOIN o un RIGHT JOIN puede anidarse dentro
de un INNER JOIN, pero un INNER JOIN no puede anidarse dentro de un LEFT
JOIN o un RIGHT JOIN.
Ejemplo
SELECT
DISTINCTROW Sum([Precio
unidad] * [Cantidad]) AS
[Ventas],
[Nombre] & " " & [Apellidos]
AS [Nombre completo]
FROM [Detalles
de pedidos],
Pedidos, Empleados, Pedidos
INNER JOIN [Detalles
de pedidos] ON
Pedidos.
[ID de pedido] = [Detalles
de pedidos].[ID de pedido], Empleados INNER
JOIN
Pedidos ON
Empleados.[ID de empleado] = Pedidos.[ID de empleado] GROUP
BY
[Nombre] & " " & [Apellidos];
Crea dos combinaciones equivalentes: una entre
las tablas Detalles de pedidos y Pedidos, y la otra entre las tablas Pedidos
y Empleados. Esto es necesario ya que la tabla Empleados no contiene datos
de ventas y la tabla Detalles de pedidos no contiene datos de los empleados.
La consulta produce una lista de empleados y sus ventas totales.
Si empleamos la cláusula INNER en la consulta
se seleccionarán sólo aquellos registros de la tabla de la
que hayamos escrito a la izquierda de INNER JOIN que contengan al menos
un registro de la tabla que hayamos escrito a la derecha. Para solucionar
esto tenemos dos cláusulas que sustituyen a la palabra clave INNER,
estas cláusulas son LEFT y RIGHT. LEFT toma todos los registros
de la tabla de la izquierda aunque no tengan ningún registro en
la tabla de la izquierda. RIGHT realiza la misma operación pero
al contrario, toma todos los registros de la tabla de la derecha aunque
no tenga ningún registro en la tabla de la izquierda.
|
|