Es sorprendente lo poco que se usan en el mundo real las Combinaciones Externas u Outer Joins. Las Combinaciones Externas nos permiten seleccionar las filas de una tabla aunque estas no tengan correspondencia con las filas de la otra tabla con la que se combinan.
PROBLEMA:
Para estas las dos tablas USUARIOS y POBLACIONES tenemos:
Usuarios:
NOMBRE | ID_POBLACION |
Oscar | 1 |
Fernando | |
María | 2 |
Y poblaciones:
ID_POBLACION | POBLACION |
1 | Madrid |
2 | León |
Si queremos saber todos los usuarios y su población (si es posible) no podemos usar el siguiente SQL porque solo nos devolvería los usuarios con población conocida:
SELECT USUARIOS.NOMBRE, POBLACIONES.POBLACION FROM USUARIOS, POBLACIONES WHERE USUARIOS.ID_POBLACION = POBLACIONES.ID_POBLACION;
Nos devolvería:
NOMBRE | POBLACION |
Oscar | Madrid |
María | León |
Para evitar esto, demasiado a menudo se usan consultas anidadas, las cuales no tienen ninguna ventaja y si una grandísima penalización en rendimiento que crece exponencialmente con el número de filas devueltas. Un ejemplo sería:
SELECT USUARIOS.NOMBRE, (SELECT POBLACIONES.POBLACION FROM POBLACIONES WHERE POBLACIONES.ID_POBLACION = USUARIOS.ID_POBLACION) AS POBLACION FROM USUARIOS
O esto mismo usando funciones que ejecutan las subconsultas, y que aunque el código es mucho más claro, realmente es equivalente e igualmente mala idea:
SELECT USUARIOS.NOMBRE, DAME_POBLACION(USUARIOS.ID_POBLACION) AS POBLACION FROM USUARIOS
SOLUCION:
Esto mismo es mucho más sencillo y eficiente hacerlo mediante Combinaciones Externas u Outer Joins con el siguiente formato:
SELECT USUARIOS.NOMBRE, POBLACIONES.POBLACION
FROM USUARIOS, POBLACIONES
WHERE USUARIOS.ID_POBLACION = POBLACIONES.ID_POBLACION (+);
Ejecutando esta consulta nos devolvería:
NOMBRE | POBLACION |
Oscar | Madrid |
Fernando | |
María | León |
Selecciona todas las filas de la tabla «USUARIOS» aunque no tengan correspondencia con las filas de la tabla «POBLACIONES», se utiliza el símbolo (+), y el resto de columnas de la tabla «POBLACIONES» se rellena con NULL.