Unidad 4. Consultas multitabla (I)


4.1. Introducción

Hasta ahora hemos visto consultas que obtienen los datos de una sola tabla, en este tema veremos cómo obtener datos de diferentes tablas.
En esta parte ampliaremos la cláusula FROM y descubriremos nuevas palabras reservadas (UNION, EXCEPT e INTERSECT) que corresponden a operaciones relacionales.
Para obtener datos de varias tablas tenemos que combinar estas tablas mediante alguna operación basada en el álgebra relacional.
El álgebra relacional define una serie de operaciones cuyos operandos son tablas y cuyo resultado es también una tabla.
Las operaciones de álgebra relacional implementadas en Transact-Sql son:

  • La unión UNION
  • La diferencia EXCEPT
  • La intersección INTERSECT
  • El producto cartesiano CROSS JOIN
  • La composición interna INNER JOIN
  • La composición externa LEFT JOIN, RIGHT JOIN Y FULL JOIN

 En todo el tema cuando hablemos de tablas nos referiremos tanto a las tablas que físicamente están almacenadas en la base de datos como a las tablas temporales y a las resultantes de una consulta o vista.

4.2. La unión de tablas UNION

La unión de tablas consiste en coger dos tablas y obtener una tabla con las filas de las dos tablas, en el resultado aparecerán las filas de una tabla y, a continuación, las filas de la otra tabla.
Para poder realizar la operación, las dos tablas tienen que tener el mismo esquema (mismo número de columnas y tipos compatibles) y la tabla resultante hereda los encabezados de la primera tabla.

La sintaxis es la siguiente:

{< consulta >|(<  consulta >)}

   UNION [ALL]

{<  consulta >|(< consulta >)}

[{UNION  [ALL] {< consulta >|(< consulta >)}}[ ...n ] ]

[ORDER  BY {expression_columna|posicion_columna [ASC|DESC]}

             [  ,...n ]]

< consulta > representa la especificación de la consulta que nos devolverá la  tabla a combinar.
Puede ser cualquier especificación de consulta con la limitación de que no admite la cláusula ORDER BY, los alias de campo se pueden definir pero sólo tienen efecto cuando se indican en la primera consulta ya que el resultado toma los nombres de columna de esta.

Ejemplo: Suponemos que tenemos una tabla Valencia con las nuevas oficinas de Valencia y otra tabla Madrid con las nuevas oficinas de Madrid y queremos obtener una tabla con las nuevas oficinas de las dos ciudades:

SELECT oficina as OFI, ciudad FROM Valencia

UNION ALL

SELECT oficina,  ciudad FROM Madrid;

El resultado sería:

OFI ciudad
11 Valencia
28 Valencia
23 Madrid

El resultado coge los nombres de columna de la primera consulta y aparecen primero las filas de la primera consulta y después las de la segunda.

Si queremos que el resultado aparezca ordenado podemos incluir la cláusula ORDER BY, pero después de la última especificación de consulta, y expresion_columna será cualquier columna válida de la primera consulta.

SELECT oficina as OFI, ciudad FROM Valencia

UNION

SELECT oficina, ciudad FROM Madrid

ORDER BY ofi;
OFI ciudad
11 Valencia
23 Madrid
28 Valencia

Ahora las filas aparecen ordenadas por el número de oficina y hemos utilizado el nombre de columna de la primera consulta.

Cuando aparezcan en el resultado varias filas iguales, el sistema por defecto elimina las repeticiones.
Si se especifica ALL, el sistema devuelve todas las filas resultante de la unión incluidas las repetidas
El empleo de ALL también hace que la consulta se ejecute más rápidamente ya que el sistema no tiene que eliminar las repeticiones.

Se pueden combinar varias tablas con el operador UNION. Por ejemplo supongamos que tenemos otra tabla Pamplona con las oficinas nuevas de Pamplona:

SELECT oficina, ciudad FROM Valencia

UNION

SELECT oficina, ciudad FROM Madrid

UNION

SELECT oficina, ciudad FROM Pamplona;

Combinamos las tres tablas.

Otro ejemplo:
Obtener todos los productos cuyo precio exceda de 20 € o que se haya vendido más de 300 euros del producto en algún pedido.

SELECT idfab, idproducto

FROM  productos

WHERE precio > 20

UNION

SELECT fab, producto

FROM pedidos

WHERE importe > 300;
Febrero-2010
Pág. 4.1

Atrás  Inicio  Adelante



.