Databases

T01-009-03 Composiciones externas

Enunciado

En ocasiones, en una consulta multitabla, nos interesará mostrar registros de una de las tablas aunque no esten relacionados con ningún registro de la segunda tabla. En esas ocasiones utilizaremos las composiciones externas.

SELECT tabla1.columna1, tabla1.columna2, …, tabla2.columna1, tabla2.columna2, …
FROM tabla1

    [LEFT | RIGHT | FULL OUTER JOIN tabla2 ON (tabla1.columna=tabla2.columna)];

LEFT | RIGHT | FULL JOIN

En función de la cláusula que acompañe al JOIN, se mostrarán todos los registros de la tabla de la izquierda o derecha que cumplan las restricciones, aunque no tengan ningún registro relacionado en la otra tabla.

Ejemplo:

En el siguiente ejemplo, vamos a intentar demostrar los cambios que se producen por la utilización de LEFT o RIGHT JOIN en una consulta.

Comenzaremos haciendo una consulta en la que se muestren los países cuyo nombre comienza por 'N'.

SELECT *
FROM HR.COUNTRIES
WHERE COUNTRY_NAME LIKE 'N%'

COUNTRY_ID COUNTRY_NAME REGION_ID
NG Nigeria 4
NL Netherlands 1

Podemos observar que hay 2 países que cumplen esa restricción. Sin embargo, si ese resultado lo combinamos, mediante una composición interna, con los registros relacionados de la tabla HR.locations, la información correspondiente a Nigeria desaparece, al no existir ningún registro en la tabla locations que esté situado en ese país.

SELECT COUNTRY_NAME, STREET_ADDRESS
FROM HR.LOCATIONS JOIN HR.COUNTRIES USING (COUNTRY_ID)
WHERE COUNTRY_NAME LIKE 'N%'

COUNTRY_NAME STREET_ADDRESS
Netherlands Pieter Breughelstraat 837

El resultado cambia, si simplemente añadimos la cláusula RIGHT antes del JOIN, haciendo que reaparezca Nigeria aunque no tenga ningún registro de la tabla locations relacionado. Observa que utilizamos RIGHT porque la tabla de países se nombra a la DERECHA del JOIN.

SELECT COUNTRY_NAME, STREET_ADDRESS
FROM HR.LOCATIONS RIGHT JOIN HR.COUNTRIES USING (COUNTRY_ID)
WHERE COUNTRY_NAME LIKE 'N%'

COUNTRY_NAME STREET_ADDRESS
Nigeria -
Netherlands Pieter Breughelstraat 837

Ejercicio

Muestra las direcciones (HR.locations) que se encuentran en el país cuyo código es 'UK', junto con los nombres de los departamentos que se encuentran en dicha dirección, en el caso de que algún departamento se encuentre en dicha dirección.

Ordena el resultado alfabéticamente por la ciudad.

Tipo

SELECT

Solución


												
SELECT COUNTRY_ID, STREET_ADDRESS, CITY, DEPARTMENT_NAME FROM HR.DEPARTMENTS RIGHT JOIN HR.LOCATIONS USING (LOCATION_ID) WHERE COUNTRY_ID = 'UK' ORDER BY CITY

Prueba


											

Librerías (Onfly databases)