Databases

T01-009-01 Producto cartesiano

Enunciado

¿Qué ocurre si combinamos dos o más tablas sin ninguna restricción? Por ejemplo, regions con countries del esquema HR. Esto lo podemos hacer poniendo ambas en la cláusula FROM y separadas por comas.

SELECT *
FROM HR.regions, HR.countries

El producto cartesiano entre dos tablas da como resultado todas las combinaciones de todas las filas de esas dos tablas.

REGION_ID REGION_NAME COUNTRY_ID COUNTRY_NAME REGION_ID
1 Europe AR Argentina 2
1 Europe AU Australia 3
1 Europe BE Belgium 1
1 Europe BR Brazil 2
1 Europe CA Canada 2
1 Europe CH Switzerland 1
1 Europe CN China 3
1 Europe DE Germany 1
... ... ... ... ...

Esta operación no es de las más utilizadas ya que coge una fila de una tabla (regions) y la asocia con todos y cada uno de las filas de la otra tabla (countries), independientemente de que tengan relación o no. Por eso, nos aparece 'Europe' asociado con 'Argentina' o con 'Australia'.

Lo más normal es que queramos seleccionar los registros según algún criterio.

Necesitaremos discriminar de alguna forma para que únicamente aparezcan filas de una tabla que estén relacionadas con la otra tabla. A esto se le llama asociar tablas (JOIN).

Para hacer una composición interna se parte de un producto cartesiano y se eliminan aquellas filas que no cumplen la condición de composición.

Lo importante en las composiciones internas es emparejar los campos que se refieren a las mismas propiedades, aunque tengan nombres diferentes.

En nuestro caso, para conseguir la composición interna entre regions y countries tendremos que discriminar a través del atributo REGION_ID de ambas tablas.

SELECT *
FROM HR.regions, HR.countries
WHERE regions.REGION_ID = countries.REGION_ID

REGION_ID REGION_NAME COUNTRY_ID COUNTRY_NAME REGION_ID
1 Europe NL Netherlands 1
1 Europe FR France 1
1 Europe UK United Kingdom 1
1 Europe DK Denmark 1
1 Europe BE Belgium 1
1 Europe CH Switzerland 1
1 Europe IT Italy 1
1 Europe DE Germany 1
2 Americas US United States of America 2

Podemos observar ahora que 'Europe' ya solo está asociado a países de Europa porque el valor de REGION_ID en ambas tablas coincide.

Las reglas para las composiciones son:

  • Pueden combinarse tantas tablas como se desee.
  • El criterio de combinación puede estar formado por más de una pareja de columnas.
  • En la cláusula SELECT pueden citarse columnas de ambas tablas, condicionen o no, la combinación.
  • Si hay columnas con el mismo nombre en las distintas tablas, deben identificarse especificando la tabla de procedencia o utilizando un alias de tabla.

Las columnas que aparecen en la cláusula WHERE se denominan columnas de emparejamiento ya que son las que permiten emparejar las filas de las dos tablas. Éstas no tienen por qué estar incluidas en la lista de selección. Emparejaremos tablas que estén relacionadas entres sí y además, una de las columnas de emparejamiento será clave principal en su tabla. Cuando emparejamos campos debemos especificar de la siguiente forma: NombreTabla1. Camporelacionado1 = NombreTabla2.Camporelacionado2.

Ejercicio:

Muestra los datos de los empleados junto con los datos del departamento en el que trabajan.

Ordena el resultado alfabéticamente por los apellidos de los empleados.

No te preocupes si, en la solución que se muestra, algunos atributos aparecen desplazados. De momento, utiliza un * en el SELECT.

Tipo

SELECT

Solución


												
SELECT * FROM HR.employees, HR.departments WHERE employees.DEPARTMENT_ID = departments.DEPARTMENT_ID ORDER BY LAST_NAME

Prueba


											

Librerías (Onfly databases)